2009-08-27 5 views
5

Che cosa è un modo piacevole ed efficace per ottenere in ogni oggetto in una ListView di più di una colonna utilizzando i loop?Utilizzare i loop per ottenere ogni elemento in una ListView?

Dopo aver fatto un bel po 'di ricerche non sono riuscito a trovare nulla così quando ho trovato qualcosa su cui volevo condividerlo qui vedi se le persone hanno modi migliori per farlo. È anche un po 'come azzeccare una domanda che è destinata a venire mentre mi stavo grattando la testa per un po' pensando a come ??? eerrrr .... io?

Mi piace questo sito Web, quindi ho voluto condividere la mia soluzione alla domanda di cui sopra. Un po 'indietro, lo so, ma ancora, so che aiuterà qualcuno fuori da qualche parte. =)

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; 
    } 

Questo restituisce una rappresentazione basata schiera lineare di tutti gli elementi appartenenti a un controllo ListView mirato in un oggetto ArrayList raccolta.

+0

Quale vantaggio ha questa duplicazione di dati in un 'ArrayList' semplicemente tramite l'iterazione diretta di' Items'? –

+0

Avresti dovuto fare la domanda, poi hai risposto da solo, poi contrassegnato come accettato, (ovviamente scrivi la risposta della linea, e copia e incolla) prima che qualcuno abbia la possibilità di rispondere. – Darknight

+0

Sì, hai ragione. Nell'esempio faccio scorrere direttamente gli oggetti ma sto persistendo il mio oggetto ArrayList da qualche altra parte quindi ho bisogno di un oggetto Arraylist che potrebbe essere di qualsiasi dimensione a seconda della quantità di righe nel mio ListView. Quindi avevo bisogno di elaborare i valori di ciascun elemento nel ListView e quindi di inserire i miei risultati in un'altra parte della mia applicazione.Un arraylist mi ha permesso di raggiungere. Come ha permesso alla raccolta di crescere dinamicamente quando i loop hanno incontrato una nuova riga nella lista. – IbrarMumtaz

risposta

6

Io suggerisco di usare IEnumerable come tipo di ritorno del metodo e l'utilizzo di "yield return" per tornare ogni elementi secondari.

private IEnumerable<ListViewSubItem> GetItemsFromListViewControl() 
{      
    foreach (ListViewItem itemRow in this.loggerlistView.Items) 
    {    
     for (int i = 0; i < itemRow.SubItems.Count; i++) 
     { 
      yield return itemRow.SubItems[i]); 
     } 
    } 
} 

anche se si utilizza .NET 3.5 Io suggerisco di usare troppo LINQ.

+0

Questo è un bel modo di fare e sembra anche professionale, sono ancora un po 'flakey con questo, ti dispiacerebbe spiegare come funziona il tipo di ritorno su questo? TIA – IbrarMumtaz

+0

Dai un'occhiata a questo link: http://msdn.microsoft.com/en-us/library/dscyy5s0.aspx – mrtaikandi

0

Non ho il tempo di testare questo con il codice, ma forse è possibile inizializzare l'elenco di array con una raccolta restituita da uno dei metodi list list? Controllerò questo quando torno a casa e commenterò se alla domanda non viene data risposta prima di allora.

EDIT: Ho dato a questo un vero controllo veloce e ha compilato, eseguito e inizializzato l'arraylist con un elemento che ho inserito nella listview.

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

dare un colpo e farci sapere se funziona ... Sono d'accordo con l'altro commento però. Immagino che l'unico motivo per convertirlo in una lista di array era se avessi intenzione di mantenerlo da qualche parte oltre a un modulo Web. Certamente non per l'elaborazione della visualizzazione elenco.

EDIT # 2:

loggerlistView.Items è di tipo "System.Collections.Generic.IList" e che ha un metodo chiamato "ToList", come descritto here.

Prova ad aggiungere un riferimento a Linq? Non mi ero reso conto che questo fosse specifico di .NET 3.5 fino ad ora - scusa per la confusione.

using System.Linq; 
+1

Mi hai perso su questo, non riesco a vedere nessun elenco di intellisense per .ToList() su ListView.Items -> Pertanto non verrà compilato per me. Puoi spiegare ulteriormente? – 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. 
     } 
    } 

Questo è il mio modo di fare.

+0

Molto condensato e al punto. – IbrarMumtaz

+0

Perché non solo foreach anche i subitems? foreach (ListViewItem.ListViewSubItem subItem in itemRow.SubItems) {...} – Grammarian

+0

Non so, dovrebbe funzionare anche =). – IbrarMumtaz

0

Se si dispone di .NET 3.5, un altro e il modo IMO più facile fare ciò che si mostra sopra è

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