2012-05-07 16 views
7

Ich möchte ID und Objekttyp in meinem ListView beibehalten. Ich versuche, dies zu tun:Wie Objekttyp in ListView einfügen?

lstView.Items.Insert(MyObject); 
// can't do this, because it takes only Int and String 

In meinem Fall ist die ID int, so dass Teil in Ordnung ist. Aber wie fügt man einen Objekttyp ein und ruft ihn im geänderten Item_Selection-Event ab?

+0

Wenn Sie es nicht tun können, dann können Sie es nicht tun. Vielleicht gibt es eine Workaround - was ist dein Ziel hier? – McGarnagle

+0

Bitte fügen Sie Ihren Fragen nicht "C#" und dergleichen voran. Dafür sind die Tags da. –

Antwort

22

A ListView können nicht hinzufügen oder ein Objekt einfügen wie direkt einem ListBox oder ComboBox, sondern benötigen Sie einen ListViewItem erstellen und seine Tag Eigenschaft.

Die Tag-Eigenschaft von Msdn

Ein Objekt, das Daten über das Steuerelement enthält. Der Standardwert ist null.

Jeder Typ, der von der Object-Klasse abgeleitet wird, kann dieser -Eigenschaft zugewiesen werden. Wenn die Tag-Eigenschaft über den Windows Forms-Designer festgelegt wird, kann nur Text zugewiesen werden. Eine häufige Verwendung der Eigenschaft Tag besteht darin, Daten zu speichern, die eng mit dem Steuerelement verknüpft sind. Wenn Sie beispielsweise über ein Steuerelement verfügen, das Informationen zu einem Kunden anzeigt, speichern Sie möglicherweise ein DataSet mit der Historie des Kunden in der Tag-Eigenschaft dieses Steuerelements, sodass auf die Daten schnell zugegriffen werden kann.

Beispielcode:

MyObject myObj = new MyObject(); 

ListViewItem item = new ListViewItem(); 
item.Text = myObj.ToString(); // Or whatever display text you need 
item.Tag = myObj; 

// Setup other things like SubItems, Font, ... 

listView.Items.Add(item); 

Wenn Sie Ihr Objekt aus dem ListView zurück zu bekommen, dann können Sie die Tag Eigenschaft werfen.

private void OnListViewItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e) { 
    MyObject myObj = (MyObject)e.Item.Tag; 
    int id = myObj.Id; 

    // Can access other MyObject Members 
} 

Normalerweise ist es einfacher, die Funktionalität in eine Hilfsmethode zu verpacken.

public static void CreateListViewItem(ListView listView, MyObject obj) { 
    ListViewItem item = new ListViewItem(); 
    item.Tag = obj; 

    // Other requirements as needed 

    listView.Items.Add(item); 
} 

Und Sie tun können:

CreateListViewItem(listView, obj); 

A ListView unterstützt keine DataSource Eigenschaft wie viele Kontrollen, so dass, wenn Sie wünschen, dass Daten binden Sie etwas ein bisschen mehr brauchen zu implementieren Brauch.

+0

Dies ist eine großartige Antwort. Super hilfreich. – Paperwaste

0

Schnellster Weg, um dies ist eine Liste Ihres Objekts auf der Seite zu halten:

List<MyObject> list = ... ; // my list 

einen Wörterbuch aus der Liste generiert mit einem String als ID, oder Sie können den Index verwenden, um von der abrufen Original-Liste:

Dictionary<int,string> listBinder = new Dictionary<int,string>(
    list.Select(i => new KeyValuePair<int,string>(i.ID, i.Name)) 
); 

Bind oder Code-Behind die Listenansicht auf das Wörterbuch Anbringen dann das ausgewählte Element verwenden Sie Ihr Objekt von Ihrer privaten Liste abzurufen.

2

Erstellen Sie ein neues listviewitem-Objekt. Verwenden Sie die Tag-Eigenschaft.