2012-07-11 84 views
2

我一直在想了一會兒有關代碼如下:如何通過名稱而不是索引來引用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 

我想辦法通過其名稱來引用列,因爲它是更具可讀性,並降低的機會犯了一個錯誤。但是,該程序不會構建。有什麼想法嗎?

+0

爲什麼被標記你的問題與C#?你所展示的代碼片段與這種編程語言有什麼關係? – 2012-07-11 15:49:23

+0

我很抱歉,因爲我沒有找到vb.net類別。 – 2012-07-11 15:52:36

回答

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) 
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。所以它需要第一個子項目和Name = "c1"

編輯:'m不太熟悉Winform控件。如果未設置SubItem名稱,則可以使用此LINQ查詢來查找給定Text的ColumnHeader的索引。然後,你可以用它來獲取正確的子項:

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

謝謝,我會試試看。 – 2012-07-11 16:05:05

+0

@ user1518100:編輯我的答案。我對winform控件並不是很熟悉,所以我可能忽略了一個簡單的解決方案,或者這並不總是如此。但嘗試一下自己。 – 2012-07-11 16:21:45

相關問題