2009-04-08 4 views
24

Créer un élément (sous la clé) est facile, mais comment ajouter des sous-éléments (valeur)?C#: comment ajouter des sous-éléments dans ListView

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

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

Répondre

24

Comme ceci:

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'est-ce que ListItem, le compilateur ne le reconnaît pas. –

+0

Je suis sûr qu'il voulait dire ListViewItem. –

+0

Listviewitem bien sûr, désolé pour la faute de frappe, mais avec un peu d'effort, je suis sûr que vous devriez avoir découvert vous-même que c'est ListViewItem au lieu de ListItem. Consultez le MSDN et surchargé Ajouter des méthodes de la propriété Items de la liste ... –

28

Vous assommer le sous-éléments dans un tableau et ajouter le tableau comme un élément de liste.

L'ordre dans lequel vous ajoutez des valeurs au tableau dicte la colonne qu'ils apparaissent sous alors pensez de vos titres sous rubrique que [0], [1], [2], etc.

Voici un exemple de code:

//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

Euh ... J'ai utilisé cette technique environ quatre fois dans la dernière quinzaine. Pourquoi les downvotes? –

+0

+1 pour offrir une alternative parfaitement valide aux autres réponses. Pourquoi avez-vous reçu un downvote je ne sais pas. –

+3

Une alternative plus facile est de le faire comme suit: 'listView.Items.Add (new ListViewItem (nouvelle chaîne [] {" Col1 "," SubItem2 "," SubItem3 "," Et ainsi de suite "}));' – c00000fd

2

Créer un élément listview

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

pourquoi est-ce que c'est downvoted? Copier collé à partir de msdn – RvdK

15

Supposons que vous ayez une collection Liste contenant de nombreux éléments à afficher dans un ListView, prenez l'exemple suivant qui itère à travers la liste Collection:

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

ce code produit la sortie suivante dans le ListView (bien sûr selon la façon dont beaucoup d'éléments que vous avez dans la Collection de Liste):

Fondamentalement, la première colonne est un listview qui contient de nombreux sous-éléments (autres colonnes). Cela peut sembler étrange mais listview est très flexible, vous pouvez même créer un explorateur de fichiers semblable à Windows avec!

+0

Cette logique devrait être sous la classe 'Inspection' car il doit connaître tous les internes ... – ja72

1

Super !! Cela m'a beaucoup aidé. J'avais l'habitude de faire la même chose en utilisant VB6 mais maintenant c'est complètement différent. nous devrions ajouter cette

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

J'ai affiné cela en utilisant une méthode d'extension sur le ListViewItemsCollection. À mon avis, cela rend le code d'appel plus concis et favorise également une réutilisation plus générale.

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

Appeler les AddWithTextAndSubItems ressemble à ceci:

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

Hope this helps!

+0

Très bien, mais qu'est-ce qui est passé en tant que ListView.ListViewItemCollection lors de l'appel de cette méthode d'extension? –

+0

@ClayShannon: comme c'est une méthode d'extension, elle "étend" le comportement du .NET FX ListView.ListViewItemCollection. Le compilateur transforme le style de méthode d'extension en un appel à la méthode statique. Donc 'myListViewControl.Items.AddWithTextAndSubItems (" Text "," Sous-Item 1 "," Sous-Item 2 ");' devient 'ListViewItemCollectionExtender.AddWithTextAndSubItems (myListViewControl.Items," Text "," Sous-Item 1 "," Sous-Item 2 ");' Magie du compilateur !! – BrianB

2

ajouter:

.SubItems.Add("asdasdasd"); 

à la dernière ligne de votre code afin qu'il ressemblera à ceci à la fin.

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

En général:

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

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

Je pense que le plus rapide/neatest façon de le faire:

Pour chaque méthode de classe ont string[] obj.ToListViewItem() et faites ceci:

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

ici est un exemple de définition

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

En prime, vous pouvez avoir une méthode static qui retourne la liste ColumnHeader[] pour la mise en place des colonnes de ListView avec

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