2012-07-11 6 views
2

Je me suis demandé pendant un certain temps sur le code ci-dessous:Comment faire référence à un sous-élément listview par son nom, pas par son index?

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 

Je veux un moyen de se référer à la colonne par son nom, car il est plus facile à lire, et diminue la chance de faire une erreur. Cependant, le programme ne construira pas. Des pensées?

+0

Pourquoi votre question taggés avec C#? Qu'est-ce que l'extrait de code que vous avez montré a à voir avec ce langage de programmation? –

+0

Je suis désolé parce que je n'ai pas trouvé la catégorie vb.net. –

Répondre

2

Vous pouvez spécifier le nom de ListViewSubItem et consultez le paragraphe de ce nom:

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

Si vous ajoutez vos sous-éléments de cette façon, MsgBox(ListView1.Items(0).SubItems("c1").Text) sera travail.

Mise à jour:

Malheureusement, cela ne fonctionnera pas pour la première sous-élément. Pour résoudre ce problème, vous pourriez avoir besoin de créer tous les sous-éléments (y compris par défaut) avant 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

Vous pouvez utiliser un peu de LINQ:

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

Enumerable.Where filtres une séquence de valeurs selon un prédicat. First prend le premier élément. Il faut donc le Text premier sous-élément avec Name = "c1".

Édition: Je ne suis pas si familier avec les contrôles Winform. Si le nom SubItem n'est pas défini, vous pouvez utiliser cette requête LINQ pour trouver l'index de ColumnHeader avec le Text donné. Ensuite, vous pouvez l'utiliser pour obtenir le sous-élément correct:

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

merci, je vais l'essayer. –

+0

@ user1518100: J'ai édité ma réponse. Je ne suis pas si familier avec les contrôles winform, donc il est peut-être vrai que j'ai oublié une solution simple ou cela ne fonctionne pas toujours. Mais essayez vous-même. –

Questions connexes