2009-08-27 7 views
5

Quel est un moyen agréable et efficace d'obtenir à chaque élément dans un ListView de plus d'une colonne en utilisant des boucles? Après avoir fait un peu de fouiller autour de moi, je ne pouvais pas vraiment trouver quelque chose, alors quand j'ai trouvé quelque chose que je voulais partager ici, voir si les gens ont de meilleures façons de le faire. Aussi un peu comme préempter une question qui est lié à venir comme je me grattais la tête pour un peu en pensant comment faire ??? eerrrr .... je? J'aime ce site Web, donc je voulais partager ma solution à la question ci-dessus. Un peu en arrière je sais mais quand même, je sais que ça va aider quelqu'un à sortir. =)Utiliser des boucles pour obtenir chaque élément dans un ListView?

private ArrayList getItemsFromListViewControl() 
    {      
     ArrayList lviItemsArrayList = new ArrayList(); 

     foreach (ListViewItem itemRow in this.loggerlistView.Items) 
     { 
      //lviItemsArrayList.Add(itemRow.Text); <-- Already included in SubItems so ... =) 

      for (int i = 0; i < itemRow.SubItems.Count; i++) 
      { 
       lviItemsArrayList.Add(itemRow.SubItems[i].Text); 
       // Do something useful here, for example the line above. 
      } 
     } 
     return lviItemsArrayList; 
    } 

Ceci renvoie un réseau linéaire représentation sur la base de tous les éléments appartiennent à un contrôle de liste cible dans un objet de collection ArrayList.

+0

Quel avantage cette copie de données dans une ArrayList a-t-elle juste sur itéter directement dans Items? –

+0

Vous auriez dû poser la question puis vous l'avez répondu vous-même, puis l'avoir marqué comme accepté, (bien sûr écrire la réponse de la ligne, et copier et coller) avant que quelqu'un ait la chance d'y répondre. – Darknight

+0

Oui, vous avez raison. Dans l'exemple, je passe directement à travers les éléments, mais je persiste dans mon objet ArrayList à un autre endroit. J'ai donc besoin d'un objet d'arrailisation qui peut être de n'importe quelle taille en fonction du nombre de lignes dans ListView. J'ai donc eu besoin de traiter les valeurs de chaque élément dans ListView et ensuite nourrir mes résultats dans une autre partie de mon application.Un arrayliste m'a permis d'accomplir. Comme cela permettait à la collection de se développer de manière dynamique au fur et à mesure que les boucles rencontraient une nouvelle ligne dans la liste. – IbrarMumtaz

Répondre

6

Je suggère d'utiliser IEnumerable comme type de retour de la méthode et l'utilisation de « yield return » pour retourner chaque sous-éléments. Cependant, si vous utilisez .NET 3.5, je suggère également d'utiliser LINQ.

+0

C'est une belle façon de faire et ça a l'air professionnel aussi, je suis encore un peu floconneux avec celui-ci, cela vous dérangerait-il d'expliquer comment fonctionne le type de retour sur celui-ci? TIA – IbrarMumtaz

+0

Jetez un oeil à ce lien: http://msdn.microsoft.com/en-us/library/dscyy5s0.aspx – mrtaikandi

0

Je n'ai pas le temps de tester cela avec du code, mais peut-être que vous pourriez initialiser la liste de tableau avec une collection retournée par l'une des méthodes listview? Je vérifierai ceci quand je rentre à la maison et commenterai si la question n'est pas répondue avant alors.

EDIT: J'ai donné une vraie vérification rapide et il a compilé, couru et initialisé l'arraylist avec un élément que j'ai mis dans la liste.

ArrayList lviItemsArrayList = new ArrayList(loggerlistView.Items.ToList()); 

Donnez un coup de feu et laissez-nous savoir si cela fonctionne ... Je suis d'accord avec l'autre commentaire que. Je suppose que la seule raison pour le convertir en une liste de tableau était si vous alliez persister quelque part autre qu'un formulaire Web. Certainement pas pour le traitement de la vue liste.

EDIT # 2:

loggerlistView.Items est de type "System.Collections.Generic.IList" et qui a une méthode appelée "ToList" comme décrit here.

Essayez d'ajouter une référence à Linq? Je n'ai pas réalisé que c'était spécifique à .NET 3.5 jusqu'à présent - désolé pour la confusion.

using System.Linq; 
+1

Vous m'avez perdu sur celui-ci, je ne vois pas de liste d'intellisense pour .ToList() sur ListView.Items -> Par conséquent ne compilera pas pour moi. Pouvez-vous expliquer plus loin? – IbrarMumtaz

4
foreach (ListViewItem itemRow in this.ListView.Items) 
    {    
     for (int i = 0; i < itemRow.SubItems.Count; i++) 
     { 
      // Do something useful here ! 
      // e.g 'itemRow.SubItems[count]' <-- Should give you direct access to 
      // the item located at co-ordinates(0,0). Once you got it, do something 
      // with it. 
     } 
    } 

Cest ma façon de le faire.

+0

Fortement condensé et au point. – IbrarMumtaz

+0

Pourquoi ne pas simplement foreach les sous-éléments? foreach (ListItem.ListViewSubItem subItem dans itemRow.SubItems) {...} – Grammarian

+0

Dunno, cela devrait fonctionner aussi =). – IbrarMumtaz

0

Si vous avez .NET 3.5, une autre et de l'OMI plus facile de faire ce que vous montrer ci-dessus est

var qry = from i in listView1.Items.Cast<ListViewItem>() 
      from si in i.SubItems.Cast<System.Windows.Forms.ListViewItem.ListViewSubItem>() 
      select si.Text; 
Questions connexes