【问题标题】:Combobox binded to a list. Adding new item to the list does not affect combobox组合框绑定到一个列表。向列表中添加新项目不会影响组合框
【发布时间】:2013-04-23 18:13:07
【问题描述】:

有如下代码:

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

【问题讨论】:

    标签: c# winforms data-binding combobox datasource


    【解决方案1】:

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

    【讨论】:

    • @Javidan 是的。但如果它是您正在更改的自定义类型成员,它不会引发事件。 (例如,如果您正在显示来自对象的名为 name 的属性,并且您更改了 name 的值)。
    • 我阅读了您在解决方案中提供的链接,如果不是您的答案,我将不会意识到它。谢谢
    • 这行得通。但我需要离开 List,因为这只是一个示例,在实际项目中我无法将 List 更改为 BindingList。有什么办法吗?
    • 您可以使用BindingList&lt;string&gt; 并创建像MyList 这样的属性,并且只放get 部分返回像BindingList&lt;string&gt;.ToList()
    • @clumpter 我添加了一个可能的解决方案,不需要对列表进行任何更改。但我会建议研究另一种方法。
    【解决方案2】:

    发生这种情况是因为当您的List 发生更改时,没有发生任何事件来通知ComboBox 有关更改。使用 ObservableCollection&lt;string&gt; 而不是 List&lt;string&gt; 。它类似于List,但具有功能。 ObservableCollection&lt;string&gt; 遵循INotifyCollectionChanged, INotifyPropertyChanged 接口,这些都是必需的事件。

    【讨论】:

    • ObservableCollection 也不会自动更新组合框。
    • 我想它一定能解决你的问题。但无论如何,使用BindingList&lt;string&gt; 作为@MAV 的解决方案
    猜你喜欢
    • 2014-06-09
    • 1970-01-01
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-16
    相关资源
    最近更新 更多