2009-04-08 9 views
24

Tworzenie elementu (Pod kluczem) jest łatwe, ale jak dodać elementy podrzędne (Wartość)?C#: Dodawanie podpunktów w ListView

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

spróbować. listView1.Items.Add (new ListViewItem (new [] {"1", "2", "3", "4", "5"})); –

Odpowiedz

24

tak:

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

Co to jest ListItem, kompilator go nie rozpoznaje. –

+0

Jestem pewien, że miał na myśli ListViewItem. –

+0

Listviewitem, przepraszam za literówkę, ale przy odrobinie wysiłku jestem pewien, że powinieneś sam się przekonać, że to ListViewItem zamiast ListItem. Sprawdź MSDN i przeciążone Dodaj metody właściwości Items listy ... –

28

Jesteś walnięcie podpunktach do tablicy i dodać tablicę jako elementu listy.

Kolejność dodawania wartości do tablicy dyktuje kolumnę one pojawiają się w tak myśleć o swoich podrzędnych nagłówków przedmioty jako [0], [1], [2] itd

Oto przykładowy kod:

//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 ... Użyłem tej techniki około cztery razy w ciągu ostatnich dwóch tygodni. Dlaczego spadki? –

+0

+1 za oferowanie idealnie słusznej alternatywy dla innych odpowiedzi. Dlaczego otrzymałeś skargę, której nie znam. –

+3

Łatwiejszym rozwiązaniem jest zrobienie tego jako takiego: 'listView.Items.Add (new ListViewItem (nowy ciąg [] {" Col1 "," SubItem2 "," SubItem3 "," I tak dalej "}));' – c00000fd

2

Utwórz element listview

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

dlaczego czy jest to odrzucane? Kopiuj wklejony z msdn – RvdK

15

Załóżmy, że masz Kolekcja lista zawierająca wiele elementów, aby pokazać w ListView, wziąć poniższy przykład, który dokonuje iteracji kolekcji listy:

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

Ten kod wygeneruje następujące wyniki w ListView (oczywiście w zależności od sposobu wiele pozycji w kolekcji list):

Zasadniczo pierwsza kolumna jest listviewviewem zawierającym wiele podelementów (inne kolumny). Może się to wydawać dziwne, ale listview jest bardzo elastyczny, możesz nawet zbudować z niego eksplorator plików w stylu windows!

+0

Ta logika powinna należeć do klasy 'Inspection', ponieważ musi znać wszystkie elementy wewnętrzne ... – ja72

1

Świetne !! Bardzo mi pomogło. Zrobiłem to samo używając VB6, ale teraz jest zupełnie inaczej. powinniśmy dodać ten

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

Mam wyrafinowane to stosując metodę rozszerzenia na ListViewItemsCollection. Moim zdaniem sprawia, że ​​kod wywołujący jest bardziej zwięzły, a także promuje bardziej ogólne wykorzystanie.

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

Wywoływanie AddWithTextAndSubItems wygląda następująco:

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

Nadzieja to pomaga!

+0

Bardzo ładnie, ale co jest przekazywane jako ListView.ListViewItemCollection podczas wywoływania tej metody rozszerzenia? –

+0

@ClayShannon: ponieważ jest to metoda rozszerzenia, "rozszerza" zachowanie .NET FX ListView.ListViewItemCollection. Kompilator zamienia styl metody rozszerzenia na wywołanie metody statycznej. Tak więc 'myListViewControl.Items.AddWithTextAndSubItems (" Text "," Sub Item 1 "," Sub Item 2 ");' staje się 'ListViewItemCollectionExtender.AddWithTextAndSubItems (myListViewControl.Items," Text "," Sub Item 1 "," Sub Item 2 " ");' Kompilator magia !! – BrianB

2

add:

.SubItems.Add("asdasdasd"); 

do ostatniej linii kodu, tak będzie wyglądać to w końcu.

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

Ogólnie:

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

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

myślę najszybszy/najwspanialszej sposób to zrobić:

Dla każdej klasy mają string[] obj.ToListViewItem() metodę, a następnie to zrobić:

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

Tutaj to przykładowa definicja

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

Jako dodatkowy bonus można mieć static metodę, która zwraca ColumnHeader[] listy do utworzenia kolumny listview z

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