2009-04-08 35 views
24

Crear un elemento (debajo de la tecla) es fácil, pero ¿cómo agregar los subelementos (valor)?C#: Cómo agregar subelementos en ListView

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

probar esto. listView1.Items.Add (new ListViewItem (new [] {"1", "2", "3", "4", "5"})); –

Respuesta

24

De esta manera:

ListViewItem lvi = new ListViewItem(); 
lvi.SubItems.Add("SubItem"); 
listView1.Items.Add(lvi); 
2
ListViewItem item = new ListViewItem(); 
item.Text = "fdfdfd"; 
item.SubItems.Add ("melp"); 
listView.Items.Add(item); 
+0

¿Qué es ListItem? El compilador no lo reconoce. –

+0

Estoy seguro de que se refería a ListViewItem. –

+0

Listviewitem ofcourse, disculpe el error tipográfico, pero con un poco de esfuerzo, estoy seguro de que debería haber descubierto que es ListViewItem en lugar de ListItem. Eche un vistazo a MSDN y sobrememore los métodos Add de los Items de la vista de lista ... –

28

Usted Golpe a los subelementos en una matriz y añadir la matriz como un elemento de la lista.

El orden en que se agregan los valores de la matriz dicta la columna que aparecen en lo que pensar en los encabezados de subelemento como [0], [1], [2], etc.

Aquí está un ejemplo 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); 
} 
+0

Er ... He usado esta técnica unas cuatro veces en la última quincena. ¿Por qué los downvotes? –

+0

+1 por ofrecer una alternativa perfectamente válida a las otras respuestas. Por qué recibiste un voto negativo que no sé. –

+3

Una alternativa más fácil es hacerlo como tal: 'listView.Items.Add (new ListViewItem (nueva cadena [] {" Col1 "," SubItem2 "," SubItem3 "," Y así sucesivamente "}));' – c00000fd

2

crear un elemento listview

ListViewItem item1 = new ListViewItem("sdasdasdasd", 0) 
item1.SubItems.Add("asdasdasd") 
+0

por qué ¿esto es downvoted? Copie pegado desde msdn – RvdK

15

Suponga que tiene una colección de lista que contiene muchos elementos que mostrar en un ListView, tomar el siguiente ejemplo que recorre en iteración la colección de lista:

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 genera la siguiente salida en el ListView (por supuesto, dependiendo de cómo muchos elementos que tiene 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!

+0

Esta lógica debe estar bajo la clase 'Inspección' ya que debe conocer todas las partes internas ... – ja72

1

¡Genial! Me ha ayudado mucho. Solía ​​hacer lo mismo con VB6, pero ahora es completamente diferente. debemos añadir este

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

he refinado esto utilizando un método de extensión en el 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 los AddWithTextAndSubItems se parece a esto:

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

Espero que esto ayude!

+0

Muy bien, pero ¿qué se pasa como ListView.ListViewItemCollection al llamar a este método de extensión? –

+0

@ClayShannon: como es un método de extensión, "amplía" el comportamiento de .NET FX ListView.ListViewItemCollection. El compilador convierte el estilo del método de extensión en una llamada al método estático. Así 'myListViewControl.Items.AddWithTextAndSubItems (" Texto "," Sub Item 1 "," Sub Item 2 ");' se convierte en 'ListViewItemCollectionExtender.AddWithTextAndSubItems (myListViewControl.Items," Text "," Sub Item 1 "," Sub Item 2 ");' ¡Magia del compilador! – BrianB

2

complemento:

.SubItems.Add("asdasdasd"); 

a la última línea de su código por lo que se verá así en el final.

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

general:

ListViewItem item = new ListViewItem("Column1Text") 
    { Tag = optionalRefToSourceObject }; 

item.SubItems.Add("Column2Text"); 
item.SubItems.Add("Column3Text"); 
myListView.Items.Add(item); 
3

creo que la forma más rápida/más bonito de hacer esto:

Para cada clase tiene string[] obj.ToListViewItem() método y luego haga lo siguiente:

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

Aquí es 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 un beneficio adicional que puede tener un método que devuelve staticColumnHeader[] lista para la creación de las columnas de vista de lista con

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