以下のコードはあるサンプルから作ったものです。
3つのコードとForm1にListview1を貼り付けています。
これをVB.net2005 Expres Editionで以下のコードの中に書いたのでみてほしいのですが、
「ここでエラーが出る①」のところでエラーが出ます。
「ここはエラーが出ない②」のところはForm1の中でのコードですがエラーとなりません。
いまあるプログラムを作っていてForm1の中でのコードが多くなりすぎるとVBがの処理が重いので、
class1としてこのコードを分けようと思い以下のようにしましたが、
「ここでエラーが出る①」のところでどうしてもエラーが出ます。
どうしたらエラーが出ないのでしょうか?
要するにForm1 に貼り付けたListview1の中の項目を、Form1の中に書いたコードからではなく、
class1のコードから取得したいのですが。。。
'Form1.Designer.vbのコード********************************
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Partial Class Form1
Inherits System.Windows.Forms.Form
#Region " Windows フォーム デザイナで生成されたコード "
Public Sub New()
MyBase.New()
' この呼び出しは Windows フォーム デザイナで必要です。
InitializeComponent()
' InitializeComponent() 呼び出しの後に初期化を追加します。
InitializeListView()
End Sub
' Form は、コンポーネント一覧に後処理を実行するために dispose をオーバーライドします。
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub
' Windows フォーム デザイナで必要です。
Private components As System.ComponentModel.IContainer
' メモ : 以下のプロシージャは、Windows フォーム デザイナで必要です。
'Windows フォーム デザイナを使って変更してください。
' コード エディタを使って変更しないでください。
Friend WithEvents ListView1 As System.Windows.Forms.ListView
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
Me.ListView1 = New System.Windows.Forms.ListView
Me.SuspendLayout()
'
'ListView1
'
Me.ListView1.Location = New System.Drawing.Point(16, 16)
Me.ListView1.Name = "ListView1"
Me.ListView1.Size = New System.Drawing.Size(264, 232)
Me.ListView1.TabIndex = 0
'
'Form1
'
Me.AutoScaleBaseSize = New System.Drawing.Size(5, 12)
Me.ClientSize = New System.Drawing.Size(292, 266)
Me.Controls.Add(Me.ListView1)
Me.Name = "Form1"
Me.Text = "Form1"
Me.ResumeLayout(False)
End Sub
#End Region
End Class
'Class1.vbのコード********************************
Public Class Class1
Public Sub aaa()
Dim fm As New Form1
Dim b = fm.ListView1.Items(1).SubItems(1).Text'<------ここでエラーが出る①
End Sub
End Class
'Form1.vbのコード****************************************
Imports Microsoft.Win32
Public Class Form1
Inherits System.Windows.Forms.Form
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
RefreshListView()
End Sub
Private columnName As ColumnHeader
Private columnType As ColumnHeader
Private columnData As ColumnHeader
' ListViewコントロールを初期化します。
Private Sub InitializeListView()
' ListViewコントロールのプロパティを設定
ListView1.FullRowSelect = True
ListView1.GridLines = True
ListView1.Sorting = SortOrder.Ascending
ListView1.View = View.Details
' 列(コラム)ヘッダの作成
columnName = New ColumnHeader
columnType = New ColumnHeader
columnData = New ColumnHeader
columnName.Text = "名前"
columnName.Width = 100
columnType.Text = "種類"
columnType.Width = 60
columnData.Text = "データ"
columnData.Width = 150
Dim colHeaderRegValue() As ColumnHeader = _
{Me.columnName, Me.columnType, Me.columnData}
ListView1.Columns.AddRange(colHeaderRegValue)
End Sub
' ListViewコントロールのデータを更新します。
Private Sub RefreshListView()
' ListViewコントロールのデータをすべて消去します。
Me.ListView1.Items.Clear()
' ListViewコントロールにデータを追加します。
Dim item1() As String = New String() {"リンゴ", "果物", "赤"}
ListView1.Items.Add(New ListViewItem(item1))
Dim item2() As String = New String() {"メロン", "果物", "緑"}
ListView1.Items.Add(New ListViewItem(item2))
Dim item3() As String = New String() {"ピーマン", "野菜", "緑"}
ListView1.Items.Add(New ListViewItem(item3))
Dim a = ListView1.Items(1).SubItems(1).Text'<------ここはエラーが出ない②
Dim cl As New Class1
cl.aaa()'<------ここはでclass1を読みに行っている③
End Sub
End Class
shellken さんへ
cl.aaa(ListView1) '<------ここはでclass1を読みに行っている③
Public Sub aaa(ByVal list As ListView)
Dim fm As New Form1
Dim b = list.Items(1).SubItems(1).Text '<------ここでエラーが出る①
End Sub
とするもよし
Dim b = Form1.ListView1.Items(1).SubItems(1).Text '<------ここでエラーが出る①
とするもよし
いろいろやり方はあります。
ガンバです。
ありがとうございました。
解決しました。
申し訳ありませんが、追加の質問です。
①Form1から独立した別のクラスから値を取得するときは、VB梅さんがご教授してくださった
(ByVal 任意の名前 as コントロール名)でどのようなコントロールの場合でも使えますか?
②Public Sub aaa(ByVal list1 As ListView,ByVal list2 As ListView)
と2つ以上のListviewを渡したり、
Public Sub aaa(ByVal list As ListView,ByVal tb As Textbox)
のように違うコントロールを渡したり出来るということでしょうか?
③Form1に貼り付けたTextbox1のTextをほかのクラスから取得する場合、この (ByVal... )がなくても取得できるのですが、今回のようにListviewではこの (ByVal... )がなければ値を取得できないのはなぜですか?
そのくらいのことは、調べるなど、実行環境があるのですから
確認してください!
自分の力で解決しましょうね。
また、MSDNを参照してください。
ありがとうございます。
いろいろやってみます。
ツイート | ![]() |