有以下代码:
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连接到组合框的最简单方法是添加/删除列表中的项目直接影响组合框的方式是什么?
答案 0 :(得分:3)
您还可以使用BindingList
在列表内容发生更改时引发ListChanged
事件。
BindingList<string> names = new BindingList<string> { "aa", "bb", "cc" };
对于ObservableCollection
和BindingList
之间的差异,请参阅this回答,这比我能提供的要好得多。
如果您必须将数据保持在正常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;
答案 1 :(得分:1)
这是因为当您的List
发生更改时,没有发生任何事件通知ComboBox
有关更改的信息。使用ObservableCollection<string>
代替List<string>
。它就像List
,但有特色。 ObservableCollection<string>
跟随INotifyCollectionChanged, INotifyPropertyChanged
接口,这些是必需的事件。