C #: cómo agregar subelementos en ListView

Crear un elemento (debajo de la tecla) es fácil, pero ¿cómo agregar subtemas (valor)?

listView1.Columns.Add("Key"); listView1.Columns.Add("Value"); listView1.Items.Add("sdasdasdasd"); //How to add "asdasdasd" under value? 

Me gusta esto:

 ListViewItem lvi = new ListViewItem(); lvi.SubItems.Add("SubItem"); listView1.Items.Add(lvi); 

Usted golpea los subelementos en una matriz y agrega la matriz como un elemento de la lista.

El orden en el que agrega valores a la matriz dicta la columna en la que aparecen, por lo tanto, piense en los encabezados de su subtema como [0], [1], [2], etc.

Aquí hay una muestra de código:

 //In this example an array of three items is added to a three column listview string[] saLvwItem = new string[3]; foreach (string wholeitem in listofitems) { saLvwItem[0] = "Status Message"; saLvwItem[1] = wholeitem; saLvwItem[2] = DateTime.Now.ToString("dddd dd/MM/yyyy - HH:mm:ss"); ListViewItem lvi = new ListViewItem(saLvwItem); lvwMyListView.Items.Add(lvi); } 

Supongamos que tiene una colección de listas que contiene muchos elementos para mostrar en un ListView, tome el siguiente ejemplo que itera a través de la colección de listas:

 foreach (Inspection inspection in anInspector.getInspections()) { ListViewItem item = new ListViewItem(); item.Text=anInspector.getInspectorName().ToString(); item.SubItems.Add(inspection.getInspectionDate().ToShortDateString()); item.SubItems.Add(inspection.getHouse().getAddress().ToString()); item.SubItems.Add(inspection.getHouse().getValue().ToString("C")); listView1.Items.Add(item); } 

Ese código produce la siguiente salida en ListView (por supuesto, dependiendo de cuántos elementos tenga en la colección de listas):

Básicamente, la primera columna es un elemento de lista que contiene muchos subelementos (otras columnas). Puede parecer extraño, pero ListView es muy flexible, ¡incluso podrías construir un explorador de archivos similar a Windows con él!

Lo he refinado usando un método de extensión en ListViewItemsCollection. En mi opinión, hace que el código de llamada sea más conciso y también promueve una reutilización más general.

 internal static class ListViewItemCollectionExtender { internal static void AddWithTextAndSubItems( this ListView.ListViewItemCollection col, string text, params string[] subItems) { var item = new ListViewItem(text); foreach (var subItem in subItems) { item.SubItems.Add(subItem); } col.Add(item); } } 

Llamar a AddWithTextAndSubItems tiene este aspecto:

 // can have many sub items as it's string array myListViewControl.Items.AddWithTextAndSubItems("Text", "Sub Item 1", "Sub Item 2"); 

¡Espero que esto ayude!

Creo que la forma más rápida / más adecuada de hacer esto:

Para cada clase, tenga el método de string[] obj.ToListViewItem() y luego haga esto:

 foreach(var item in personList) { listView1.Items.Add(new ListViewItem(item.ToListViewItem())); } 

Aquí hay una definición de ejemplo

 public class Person { public string Name { get; set; } public string Address { get; set; } public DateTime DOB { get; set; } public uint ID { get; set; } public string[] ToListViewItem() { return new string[] { ID.ToString("000000"), Name, Address, DOB.ToShortDateString() }; } } 

Como ventaja adicional, puede tener un método static que devuelva la lista ColumnHeader[] para configurar las columnas de la vista de lista con

 listView1.Columns.AddRange(Person.ListViewHeaders()); 

Crear un elemento de vista de lista

 ListViewItem item1 = new ListViewItem("sdasdasdasd", 0) item1.SubItems.Add("asdasdasd") 
 ListViewItem item = new ListViewItem(); item.Text = "fdfdfd"; item.SubItems.Add ("melp"); listView.Items.Add(item); 

añadir:

 .SubItems.Add("asdasdasd"); 

hasta la última línea de tu código, así se verá así al final.

 listView1.Items.Add("sdasdasdasd").SubItems.Add("asdasdasd"); 

Excelente !! Me ha ayudado mucho. Solía ​​hacer lo mismo con VB6, pero ahora es completamente diferente. deberíamos agregar esto

 listView1.View = System.Windows.Forms.View.Details; listView1.GridLines = true; listView1.FullRowSelect = true; 

En general:

 ListViewItem item = new ListViewItem("Column1Text") { Tag = optionalRefToSourceObject }; item.SubItems.Add("Column2Text"); item.SubItems.Add("Column3Text"); myListView.Items.Add(item);