2009-08-27 22 views
5

¿Cuál es una manera agradable y efectiva de obtener en cada elemento de un ListView de más de una columna mediante bucles?¿Utilizar loops para obtener cada elemento en un ListView?

Después de investigar un poco no pude encontrar nada, así que cuando encontré algo que quería compartir aquí, ver si las personas tienen mejores maneras de hacerlo. También es como adelantarme a una pregunta que seguramente surgirá mientras me rasco la cabeza por un momento pensando ¿cómo? eerrrr .... ¿Yo?

Me gusta este sitio web, así que quería compartir mi solución a la pregunta anterior. Más o menos al revés, lo sé, pero aún así, sé que ayudará a alguien en algún lado. =)

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

Esto devuelve una representación basada disposición lineal de todos los elementos pertenecen a un control ListView apuntado en un objeto de colección ArrayList.

+0

¿Qué ventaja tiene esta copia de datos en un 'ArrayList' sobre simplemente iterar a través de' Items' directamente? –

+0

Debería haber hecho la pregunta, haberla respondido usted mismo, haberla marcado como aceptada (por supuesto, escribir la respuesta de la línea y copiarla y pegarla) antes de que alguien tenga la oportunidad de responderla. – Darknight

+0

Sí, tienes razón. En el ejemplo realizo una iteración a través de los elementos directamente, pero estoy persistiendo mi objeto ArrayList en otro lugar, así que necesitaba un objeto de arrays que podría ser de cualquier tamaño, dependiendo de la cantidad dada de filas en mi ListView. Por lo tanto, necesitaba procesar los valores de cada elemento en ListView y luego enviar mis resultados a otra parte de mi aplicación.Un arraylist me permitió lograrlo. Como permitió que la colección creciera dinámicamente a medida que los bucles encontraban una nueva fila en la Lista. – IbrarMumtaz

Respuesta

6

sugiere emplear IEnumerable como el tipo de retorno del método y el uso de "yield return" para volver cada uno subtemas.

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

aunque si está utilizando .NET 3.5 También sugiero usar LINQ.

+0

Esta es una buena manera de hacerlo y parece profesional también, todavía soy un poco raro con esta, ¿te importaría explicar cómo funciona el tipo de devolución en esta? TIA – IbrarMumtaz

+0

Eche un vistazo a este enlace: http://msdn.microsoft.com/en-us/library/dscyy5s0.aspx – mrtaikandi

0

No tengo tiempo para probar esto con el código, pero ¿quizás podría inicializar la lista de arreglos con una colección devuelta por uno de los métodos de vista de lista? Lo verificaré cuando llegue a casa y comentaré si la pregunta no fue respondida antes.

EDITAR: Hice esto una comprobación rápida real y compiló, ejecutó e inicializó el arraylist con un elemento que puse en la lista.

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

darle un tiro y haznos saber si funciona ... Estoy de acuerdo con el otro comentario sin embargo. Me imagino que la única razón para convertirlo en una lista de arreglos era si lo iba a persistir en otro lugar que no fuera un formulario web. Ciertamente no para procesar la vista de lista.

editar # 2:

loggerlistView.Items es de tipo "System.Collections.Generic.IList" y que tiene un método llamado "ToList" como se describe here.

Intenta agregar una referencia a Linq? No me di cuenta de que esto era específico para .NET 3.5 hasta ahora, disculpe la confusión.

using System.Linq; 
+1

Me has perdido en este caso, no puedo ver ninguna lista intellisense para .ToList() en ListView.Items -> Por lo tanto, no compilaré para mí. ¿Puedes explicar más? – 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. 
     } 
    } 

Ésta es mi manera de hacerlo.

+0

Muy condensado y al grano. – IbrarMumtaz

+0

¿Por qué no solo enfocar los subelementos también? foreach (ListViewItem.ListViewSubItem subItem en itemRow.SubItems) {...} – Grammarian

+0

Dunno, eso debería funcionar también =). – IbrarMumtaz

0

Si tiene .NET 3.5, otra manera y la OMI más fácil hacer lo que muestran arriba es

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