绑定到列表的组合框.向列表中添加新项目不会影响组合框
本文关键字:组合 列表 新项目 影响 添加 绑定 | 更新日期: 2023-09-27 18:10:27
代码如下:
public partial class Form1 : Form
{
private List<string> names = new List<string> { "aa", "bb", "cc" };
public Form1()
{
InitializeComponent();
comboBox1.DataSource = names;
comboBox1.DisplayMember = "Name";
}
private void button1_Click(object sender, EventArgs e)
{
names.Add("dd");
}
}
当我点击按钮,我想添加新的值到源列表,并期望组合框将立即更新,包括该值。但事实并非如此。为什么?一般来说,将List连接到组合框的最简单的方法是什么?在List中添加/删除项目直接影响组合框的方式?
您还可以使用BindingList
,当列表的内容发生更改时引发ListChanged
事件。
BindingList<string> names = new BindingList<string> { "aa", "bb", "cc" };
关于ObservableCollection
和BindingList
的区别,请看这个答案,这个答案比我能提供的要好得多。
如果您必须将数据保存在正常的List
中,您可以将列表包装在BindingSource
中,如下所示:
private BindingSource source; //property
...
source = new BindingSource(names, "");
comboBox1.DataSource = source;
然后添加到源:
source.Add("3");
BindingSource
将向底层列表添加项并引发ListChanged
事件。
如果你也不能使用这个解决方案,我想不出任何其他方法,除了在你更新列表时重置DataSource
:
names.Add("dd");
comboBox1.DataSource = null;
comboBox1.DataSource = names;
这是因为当您的List
发生更改时,没有发生通知ComboBox
有关更改的事件。使用ObservableCollection<string>
代替List<string>
。它像List
,但有功能。ObservableCollection<string>
接INotifyCollectionChanged, INotifyPropertyChanged
接口,这些都是需要的事件