如何通过名称而不是索引来引用listview子项?

时间:2012-07-11 15:47:26

标签: vb.net listview

我一直在想下面的代码:

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  

我想要一种通过名称引用列的方法,因为它更具可读性,并且减少了出错的可能性。但是,该程序将无法构建。有什么想法吗?

2 个答案:

答案 0 :(得分: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采用第一个元素。因此,第一个子项目Text需要Name = "c1"

编辑:我对Winform控件不熟悉。如果未设置SubItem名称,则可以使用此LINQ查询来查找具有给定Text的ColumnHeader的索引。然后你可以用它来获得正确的SubItem:

Dim c1ICol = (From col In ListView1.Columns.Cast(Of ColumnHeader)()
              Where col.Text = "c1").First
MsgBox(ListView1.Items(0).SubItems(c1ICol.Index).Text)

答案 1 :(得分:2)

您可以指定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)