加载ListBox的正确方法是什么?

在C#.NET 2.0 Winforms中加载ListBox的正确方法是什么?

我以为我可以将它绑定到DataTable 。 没有这样的运气。
我以为我可以用Dictionary绑定它。 没运气。

我是否必须编写一个名为KeyValuePair的类,然后使用List才能用对象加载这个东西? 也许我错过了一些明显的东西。 我希望我的显示文本和值是不同的值。

简单的代码示例。 假设您有一个包含3个属性的Person类。 FirstNameLastNameAge 。 假设您要将列表框绑定到Person对象的集合。 您希望显示器显示名字,但值显示为年龄。 这是你如何做到这一点:

 List people = new List(); 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"; 

技巧是DisplayMemberValueMember

让我们假设您的数据类型称为MyDataType。 在该数据类型上实现ToString()以确定显示文本。 例如:

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

然后,您可以获取由您的数据类型组成的列表,并通过AddRange()将其塞入ListBox,如下所示:

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

如果您需要更多帮助,请告诉我们 – 了解您尝试在列表框中显示的数据类型会有所帮助。

您可以直接绑定DataTable …

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

您可以将数据源设置为您希望实现IList或IListSource的任何数据源。

您还需要将DisplayMember和ValueMember属性设置为要显示的字段,并分别关联值。

使用DataSource参数来减少性能 – 至少在ComboBoxes上,

我现在已经严格限制在对象上覆盖ToString()并使用Items.AddRange()方法添加对象,如上面的另一个评论者所描述的那样。

要绑定到字典,您必须将其包装在新的BindingSource对象中。

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