2008-11-19 8 views
22

Quelle est la bonne façon de charger un ListBox dans Winforms C# .NET 2.0? Je pensais pouvoir le lier à un DataTable. Pas de chance.
Je pensais pouvoir lier avec un Dictionary. Pas de chance.Quelle est la bonne façon de charger un ListBox?

Dois-je écrire une classe appelée KeyValuePair, puis utiliser List<KeyValuePair> juste pour pouvoir charger cette chose avec des objets? Peut-être qu'il me manque quelque chose d'évident. Je veux que mon texte et mes valeurs d'affichage soient des valeurs différentes.

Répondre

59

Exemple de code simple. Supposons que vous avez une classe Person avec 3 propriétés. FirstName, LastName et Age. Supposons que vous souhaitiez lier votre listbox à une collection d'objets Person. Vous voulez que l'affichage indique le prénom, mais que la valeur soit l'âge. Voici comment vous le faire:

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"; 

L'astuce est le DisplayMember et le ValueMember.

+5

La DataSource doit être définie après les propriétés DisplayMember et ValueMember pour éviter plusieurs requeries. – LarsTech

5

Supposons que votre type de données s'appelle MyDataType. Implémentez ToString() sur ce type de données pour déterminer le texte d'affichage. par exemple:

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

Ensuite, vous pouvez prendre une liste composée de votre type de données et fourrer dans la zone de liste via AddRange() comme suit:

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

Laissez-moi savoir si vous avez besoin d'aide - il serait aider à savoir quel type de données vous essayez d'afficher dans la liste.

+0

Je suppose que cela semble juste bizarre. si vous travaillez sur un petit projet où vous utilisez simplement DataSets/DataTables et n'avez pas d'objets métier. Je suppose que je pourrais juste écrire une classe KeyValuePair. public class KeyValuePair { objet public clé {get; ensemble;} objet public valeur {get; set;}} – BuddyJoe

+0

quand est-ce que je manque de les ajouter un KVP intégré au cadre ... gee, je me sens stupide. – BuddyJoe

3

Vous pouvez définir la source de données en fonction de la source de données qui implémente IList ou IListSource.

Vous devez également définir les propriétés DisplayMember et ValueMember sur les champs que vous souhaitez afficher et dont les valeurs sont associées respectivement.

5

Vous pouvez bind a DataTable directement ...

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

Utilisation du DataSource paramater utilisé pour aspirer la performance sage - sur ComboBoxes au moins,

Je suis maintenant fortement conditionné pour remplacer ToString() sur l'objet et juste en ajoutant les objets en utilisant la méthode Items.AddRange(), comme décrit un autre commentateur ci-dessus.

1

Pour lier un dictionnaire, vous devez l'intégrer dans un nouvel objet BindingSource.

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