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

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

当我点击按钮时,我希望向源列表中添加新值,并期望组合框立即更新以包括该值。但它没有。为什么?
总的来说,连接列表到组合框的最简单的正确方法是什么?这样做可以使在列表中添加/删除项目直接影响组合框。
2个回答

3

您还可以使用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;

我阅读了你在解决方案中提供的链接,如果不是你的答案,我将不会知道它。谢谢。 - Javidan
这可以工作。但是我需要保留List<string>,因为那只是一个示例,在真正的项目中我不能将List更改为BindingList。有什么办法吗? - clumpter
@MAV的解决方案通过重置数据源可以正常工作,但如果你知道我的意思,它看起来不太对劲。 - clumpter
@clumpter 我知道你的意思。如果可以使用第三种解决方案,我找到了一个。 - MAV
@MAV 目前我最终选择重置数据源。 - clumpter
显示剩余3条评论

1
由于更改了您的List,因此没有事件通知ComboBox有关更改的发生。请使用ObservableCollection<string>代替List<string>。它类似于List,但具有特殊功能。ObservableCollection<string>遵循INotifyCollectionChanged, INotifyPropertyChanged接口,并且这些是必需的事件。

ObservableCollection<string> 也不会自动更新组合框。 - clumpter
我认为这应该解决你的问题。但无论如何,按照@MAV的解决方案使用BindingList<string> - Javidan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接