绑定到列表的组合框.向列表中添加新项目不会影响组合框

本文关键字:组合 列表 新项目 影响 添加 绑定 | 更新日期: 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" }; 

关于ObservableCollectionBindingList的区别,请看这个答案,这个答案比我能提供的要好得多。


如果您必须将数据保存在正常的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接口,这些都是需要的事件