4

有以下代码:

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");
    }
}

当我单击按钮时,我想向源列表添加新值,并期望组合框会立即更新以包含该值。但事实并非如此。为什么?一般来说,将列表连接到组合框的最简单正确方法是在列表中添加/删除项目直接影响组合框的方式是什么?

4

2 回答 2

3

您还可以使用 a在列表内容更改时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;
于 2013-04-23T18:23:01.367 回答
1

发生这种情况是因为当您List更改时,没有发生通知ComboBox更改的事件。使用ObservableCollection<string>而不是List<string>. 它很像List,但有特点。 ObservableCollection<string>遵循INotifyCollectionChanged, INotifyPropertyChanged接口,这些是必需的事件。

于 2013-04-23T18:15:55.507 回答