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取第一个元素。所以它需要第一个 subItem 的Textwith Name = "c1"

编辑:'对 Winform 控件不太熟悉。如果未设置 SubItem 名称,则可以使用此 LINQ 查询来查找具有给定Text. 然后您可以使用它来获取正确的 SubItem:

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 回答