2

以下のコードについてしばらく疑問に思っていました。

ListView1.View = View.Details   
ListView1.Columns.Add("c1")   
ListView1.Columns.Add("c2")  
Dim Item As New ListViewItem    
Item.Text = "1"
Item.SubItems.Add("2")
ListView1.Items.Add(Item)

'MsgBox(ListView1.Items(0).SubItems("c1").Text) 'this is wrong  
MsgBox(ListView1.Items(0).SubItems(0).Text) 'this is right  

列をその名前で参照する方法が必要です。これは読みやすく、間違いを犯す可能性を減らすためです。ただし、プログラムはビルドされません。何かご意見は?

4

2 に答える 2

3

名前を指定ListViewSubItemして、その名前でサブアイテムを参照できます。

Dim subItem As New ListViewItem.ListViewSubItem
subItem.Name = "c1"
subItem.Text = "SubItem"
Item.SubItems.Add(subItem)

この方法でサブアイテムを追加すると、MsgBox(ListView1.Items(0).SubItems("c1").Text)動作します。

アップデート:

残念ながら、これは最初のサブアイテムでは機能しません。これを修正するには、前にすべてのサブアイテム (デフォルトを含む) を作成する必要がある場合がありますListViewItem

Dim subItems As ListViewItem.ListViewSubItem() = New ListViewItem.ListViewSubItem(2 - 1) {}
subItems(0) = New ListViewItem.ListViewSubItem()
subItems(0).Name = ListView1.Columns(0).Text
subItems(0).Text = "Default SubItem"
subItems(1) = New ListViewItem.ListViewSubItem()
subItems(1).Name = ListView1.Columns(1).Text
subItems(1).Text = "SubItem 1"
Dim Item As New ListViewItem(subItems, 0)
ListView1.Items.Add(Item)
于 2012-07-11T15:59:15.500 に答える
2

LINQを少し使用できます。

Dim c1Items = From subItem In ListView1.Items(0).SubItems.Cast(Of ListViewItem.ListViewSubItem)()
               Where subItem.Name = "c1"
MsgBox(c1Items.First.Text)

Enumerable.Where述語に基づいて値のシーケンスをフィルタリングします。First最初の要素を取ります。したがって、最初のsubItemTextName = "c1"

編集:'Winformコントロールにあまり精通していません。SubItem名が設定されていない場合は、このLINQクエリを使用して、指定された。を持つColumnHeaderのインデックスを見つけることができますText。次に、それを使用して正しいサブアイテムを取得できます。

Dim c1ICol = (From col In ListView1.Columns.Cast(Of ColumnHeader)()
              Where col.Text = "c1").First
MsgBox(ListView1.Items(0).SubItems(c1ICol.Index).Text)
于 2012-07-11T15:58:19.570 に答える