Combobox绑定到列表。将新项添加到列表不会影响组合框

时间:2013-04-23 18:13:07

标签: c# winforms data-binding combobox datasource

有以下代码:

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连接到组合框的最简单方法是添加/删除列表中的项目直接影响组合框的方式是什么?

2 个答案:

答案 0 :(得分:3)

您还可以使用BindingList在列表内容发生更改时引发ListChanged事件。

BindingList<string> names = new BindingList<string> { "aa", "bb", "cc" }; 

对于ObservableCollectionBindingList之间的差异,请参阅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接口,这些是必需的事件。