【问题标题】:Bind ComboBox to Two Lists in C#将 ComboBox 绑定到 C# 中的两个列表
【发布时间】:2011-08-17 13:33:42
【问题描述】:

我有两个列表。第一个是硬编码的,内容永远不会改变。第二个可以由用户编辑添加、更改和删除项目:

public List<Item> DefaultItems = new List<Item>();
public BindingList<Item> UserItems = new BindingList<Item>();
...
MyTable.DataSource = UserItems;

我想将两个列表的内容一个接一个地绑定到一个 ComboBox,并在用户编辑 UserItems 列表时自动更新。

第一部分我可以用类似的方法轻松解决:

public List<Items> AllItems
{
    get
    {
        List<Item> Items = new List<Item>();
        foreach (Item I in DefaultItems) Items.Add(I);
        foreach (Item I in UserItems) Items.Add(I);
        return Items;
    }
}
...
MyComboBox.DataSource = AllItems;

问题在于,当 UserItems 发生更改时,没有通知 AllItems 已更改,因此组合框的内容保持不变。

然后我添加了一个在 UserItems 更改时生成的事件。现在我的问题是如何强制 ComboBox 刷新。执行以下操作:

MyComboBox.DataSource = null;
MyComboBox.DataSource = AllItems;

导致 selecteditem 变为 null 并且 selectedindex 变为 -1,然后我必须在我的代码中进行处理(暂时记住当前项,之后将其恢复等)。这一切都变得非常混乱,我相信有一个聪明的方法可以解决这个问题。有吗?

谢谢,安迪

更新:我不想以第三方程序集的形式为此添加更多代码和复杂性,所以我只是继续我的混乱方法。谢谢。

【问题讨论】:

    标签: c# winforms binding


    【解决方案1】:

    您需要使用一个集合,该集合将在集合更改时通知 UI。

    您可以使用 .NET 提供的 BindingList 类,或者,如果您想尝试不同的东西,您可以下载 BindingListView 类,它将包装您现有的集合并为 UI 提供所需的通知。

    【讨论】:

    • 我将 AllItems 列表更改为 BindingList 并没有任何区别。我认为这是因为添加/更改/删除操作没有发生在该列表上,而是发生在不同的列表上。
    • @Andy - 那是正确的。必须对 BindingList 进行更改。这就是为什么我建议也看看 BindingListView。
    • 为什么不 AllItems.ResetBindings();在这里工作?它应该引发 listchanged 事件并导致组合框刷新,但事实并非如此。似乎是完美的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2013-10-21
    • 2010-10-08
    • 2011-05-16
    • 2015-01-17
    • 2014-04-19
    • 1970-01-01
    • 1970-01-01
    • 2011-03-08
    相关资源
    最近更新 更多