2008-11-19 35 views
22

Was ist die richtige Methode zum Laden eines ListBox in C# .NET 2.0 Winforms?Was ist der richtige Weg, um eine ListBox zu laden?

Ich dachte, ich könnte es einfach an eine DataTable binden. Kein solches Glück. Ich dachte, ich könnte es mit einem Dictionary binden. Kein Glück.

Muss ich eine Klasse mit dem Namen KeyValuePair schreiben und dann List<KeyValuePair> verwenden, um dieses Objekt mit Objekten laden zu können? Vielleicht vermisse ich etwas Offensichtliches. Ich möchte, dass mein Anzeigetext und meine Werte unterschiedliche Werte haben.

Antwort

59

Einfaches Codebeispiel. Angenommen, Sie haben eine Person Klasse mit 3 Eigenschaften. FirstName, LastName und Age. Angenommen, Sie möchten Ihre Listbox an eine Sammlung von Person Objekten binden. Sie möchten, dass auf dem Display der Vorname angezeigt wird, der Wert jedoch dem Alter entspricht. Hier ist, wie Sie es tun würde:

List<Person> people = new List<Person>(); 
people.Add(new Person { Age = 25, FirstName = "Alex", LastName = "Johnson" }); 
people.Add(new Person { Age = 23, FirstName = "Jack", LastName = "Jones" }); 
people.Add(new Person { Age = 35, FirstName = "Mike", LastName = "Williams" }); 
people.Add(new Person { Age = 25, FirstName = "Gill", LastName = "JAckson" }); 
this.listBox1.DataSource = people; 
this.listBox1.DisplayMember = "FirstName"; 
this.listBox1.ValueMember = "Age"; 

Der Trick ist, die DisplayMember und die ValueMember.

+5

Die DataSource sollte nach den DisplayMember- und ValueMember-Eigenschaften festgelegt werden, um mehrfache Abfragen zu verhindern. – LarsTech

5

Nehmen wir an, Ihr Datentyp heißt MyDataType. Implementieren Sie ToString() für diesen Datentyp, um den Anzeigetext zu bestimmen. zB:

class MyDataType 
{ 
    public string ToString() 
    { 
    //return the text you want to display 
    } 
} 

Dann können Sie eine Liste nehmen Ihren Datentyp aus und stopfen sie in die List-Box über AddRange() wie folgt:

ListBox l; 
List<MyDataType> myItems = new List<MyDataType>(); // populate this however you like 
l.AddRange(myItems.ToArray()); 

Lassen Sie mich wissen, wenn Sie weitere Hilfe benötigen - es wäre Hilfe, um zu wissen, welcher Datentyp in der Listbox angezeigt werden soll.

+0

Ich denke, das scheint nur seltsam. wenn Sie an einem kleinen Projekt arbeiten, in dem Sie nur DataSets/DataTables verwenden und keine Geschäftsobjekte haben. Ich schätze, ich könnte einfach eine KeyValuePair-Klasse schreiben. public class KeyValuePair { öffentlichen Objektschlüssel {get; set;} public Objekt Wert {get; set;}} – BuddyJoe

+0

Wann habe ich sie vermissen das Hinzufügen einer eingebauten in KVP Rahmen ... gee, ich fühle mich Dumm. – BuddyJoe

3

Sie können die Datenquelle auf eine beliebige Datenquelle setzen, die IList oder IListSource implementiert.

Sie müssen auch die Eigenschaften DisplayMember und ValueMember auf die Felder festlegen, die angezeigt werden sollen und denen jeweils Werte zugeordnet sind.

5

können Sie bind a DataTable direkt ...

listbox.ValueMember = "your_id_field"; 
listbox.DisplayMember = "your_display_field"; 
listbox.DataSource = dataTable; 
1

die Datasource Mit Paramater Leistung klug saugen verwendet - auf Comboboxen zumindest

Ich bin jetzt schwer zu überschreiben ToString konditioniert() auf dem Objekt und fügen Sie die Objekte nur mithilfe der Items.AddRange() -Methode hinzu, wie in einem anderen obigen Kommentar beschrieben.

1

Um an ein Wörterbuch zu binden, müssen Sie es in ein neues BindingSource-Objekt einfügen.

MyListBox.DataSource = New BindingSource(Dict, Nothing) 
MyListBox.DisplayMember = "Value" 
MyListBox.ValueMember = "Key" 
Verwandte Themen