我一直在想下面的代码:
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
我想要一种通过名称引用列的方法,因为它更具可读性,并且减少了出错的可能性。但是,该程序将无法构建。有什么想法吗?
答案 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)