在WinForms中将List<object>绑定到Listbox

64

如何在Windows Forms中将一个ListBox绑定到一个对象列表的最简单方法是什么?


8
你的平台是什么?Silverlight?WPF?Winforms?ASP.NET?答案有点依赖于这个信息。 - Muad'Dib
8个回答

75

您正在寻找DataSource 属性

List<SomeType> someList = ...;
myListBox.DataSource = someList;

你还应该设置DisplayMember属性,将其设置为对象中要在列表框中显示的属性名称。如果不这样做,它会调用ToString()


8
你好。只要我不往集合里添加任何东西,它就能正常工作。但是当我改变集合中的项时,列表框不会立即更新。即使在更改集合项后重新分配数据源也是如此。 - Hooch
如果您通过ViewModel进行绑定,则List必须封装在ObservableCollection中。 - SASS_Shooter
1
@SASS_Shooter:这个问题是关于WinForms的。 - SLaks
13
在WinForms中处理集合更新时,请使用BindingList<T> - SLaks
刚刚有同样的问题,但是想知道为什么没有 DataSource... 如果你使用 System.Windows.Controls.ListBox,相当于它的是 ItemSource - Berger
显示剩余2条评论

17

假设您正在显示一个客户对象列表,其中包含"customerName"和"customerId"属性:

listBox.DataSource = customerListObject;
listBox.DataTextField = "customerName";
listBox.DataValueField = "customerId";
listBox.DataBind();

编辑:我知道在asp.net中可以这样做 - 如果你在做winforms应用程序,应该会非常相似(希望如此...)


2
Windows.Forms.Listbox还有其他成员,请参见下文。 - surfmuggle
@surfmuggle... DataBind() 方法不存在,我猜是这样吧? - Wolf

17

System.Windows.Forms.Listbox控件绑定到一个对象列表(这里的类型为dynamic)

List<dynamic> dynList = new List<dynamic>() { 
            new {Id = 1, Name = "Elevator", Company="Vertical Pop" },
            new {Id = 2, Name = "Stairs", Company="Fitness" }
};

listBox.DataSource = dynList; 
listBox.DisplayMember = "Name";
listBox.ValueMember = "Id";  

1
我知道这个问题与此无关,但是:你如何访问“Company”成员? - Wolf
@Wolf 除非你自己挖掘列表,否则你无法这样做;省略 ValueMember 设置,使 SelectedValue 成为整个对象可能会更容易。 - Caius Jard

6

当然,这并不能提供任何有意义的东西,除非对象已经正确地覆盖了ToString()方法(或者你并不真正使用一个通用对象列表,而是可以绑定到特定字段):

List<object> objList = new List<object>();

// Fill the list

someListBox.DataSource = objList;

4
ListBox1.DataSource = CreateDataSource();
ListBox1.DataTextField = "FieldProperty";
ListBox1.DataValueField = "ValueProperty";

请参考此文了解详细示例。


3

我在这里没有看到过它,所以我发布它,因为对我来说这是WinForms中最好的方法:

    List<object> objList = new List<object>();

    listBox.DataSource = objList ;

    listBox.Refresh();
    listBox.Update();            

哦,我的天啊...谢谢!自从我最后一次使用WinForms已经过去了12年,我已经卡在这个该死的ListBox上将近两个小时了。 - Neil T.

2
这里有两种主要方法:
1: listBox1.DataSource = yourList; 对 yourList 进行任何操作(添加/删除),然后重新绑定。
将 DisplayMember 和 ValueMember 设置为控制要显示的内容。
2: listBox1.Items.AddRange(yourList.ToArray()); (或使用 for 循环执行 Items.Add(...)
您可以通过重载列表对象的 ToString() 或实现 listBox1.Format 事件来控制显示。

1
你如何重新绑定? - Andrew Truckle

-1

针对UWP应用程序:

XAML

<ListBox x:Name="List" DisplayMemberPath="Source" ItemsSource="{x:Bind Results}"/>

C#

public ObservableCollection<Type> Results

问题已标记为WinForms。 - LarsTech
@LarsTech 没有注意到这一点,因为它不是标题或正文的一部分,但我通过寻找 UWP 相同问题的答案来到了这里,也许其他人也会发现这个答案有用。 - Samir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接