2008-11-19 21 views
22

¿Cuál es la forma correcta de cargar un ListBox en C# .NET 2.0 Winforms?¿Cuál es la forma correcta de cargar un ListBox?

Pensé que podría vincularlo a un DataTable. No tal suerte.
Pensé que podría enlazarlo con un Dictionary. Sin suerte.

¿Tengo que escribir una clase llamada KeyValuePair, y luego usar List<KeyValuePair> solo para poder cargar esto con objetos? Tal vez me estoy perdiendo algo obvio. Quiero que mi texto de visualización y valores sean valores diferentes.

Respuesta

59

Ejemplo de código simple. Supongamos que tiene una clase Person con 3 propiedades. FirstName, LastName y Age. Supongamos que desea vincular su listbox a una colección de objetos Person. Desea que la pantalla muestre el primer nombre, pero el valor sea la edad. He aquí cómo lo haría:

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

El truco es el DisplayMember y el ValueMember.

+5

El DataSource debe establecerse después de las propiedades DisplayMember y ValueMember para evitar múltiples consultas. – LarsTech

5

Supongamos que su tipo de datos se llama MyDataType. Implemente ToString() en ese tipo de datos para determinar el texto de visualización. por ejemplo:

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

A continuación, puede tomar una lista que consiste en el tipo de datos y meter en el cuadro de lista a través de AddRange() de la siguiente manera:

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

Déjeme saber si usted necesita más ayuda - Sería ayuda a saber qué tipo de datos está tratando de mostrar en el cuadro de lista.

+0

Supongo que esto parece extraño. si está trabajando en un proyecto pequeño en el que solo está utilizando DataSets/DataTables y no tiene ningún objeto comercial. Creo que podría escribir una clase de KeyValuePair. clase pública KeyValuePair { clave pública objeto {get; set;} Valor objeto público {get; set;}} – BuddyJoe

+0

cuando no se me olvida que la adición de un sistema incorporado en KVP al marco ... vaya, me siento tonto. – BuddyJoe

3

Puede establecer el origen de datos en cualquier origen de datos que desee que implemente IList o IListSource.

También deberá establecer las propiedades DisplayMember y ValueMember en los campos que desea mostrar y tener los valores asociados respectivamente.

5

Puede bind a DataTable directamente ...

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

Utilizando el parámetro de origen de datos utiliza para aspirar a rendimiento - en ComboBoxes al menos,

ahora estoy muy condicionado para anular ToString() en el objeto y simplemente agregando los objetos usando el método Items.AddRange(), como lo describe otro comentarista anterior.

1

Para enlazar a un diccionario, debe envolverlo en un nuevo objeto BindingSource.

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