C# 更新与通用列表绑定的下拉框

14

我在表单上有一个下拉框,它绑定了一个类似于这样的通用字符串列表:

private List<string> mAllianceList = new List<string>();

private void FillAllianceList()
{
    // Add alliance name to member alliance list
    foreach (Village alliance in alliances)
    {
        mAllianceList.Add(alliance.AllianceName);
    }

    // Bind alliance combobox to alliance list
    this.cboAlliances.DataSource = mAllianceList;
}
用户可以向组合框中添加或删除项目。
在其他地方我看到,只需将项添加或删除到通用列表中,组合框的内容就应自动更新;如果我对其使用Sort()也应该发生同样的事情。
但出于某种原因,我无法使其正常工作。我可以看到组合框的DataSource属性在我添加/删除/排序项目时已正确更新,但组合框中显示的内容不是DataSource属性中的内容。
我肯定是缺少了什么或做错了什么。
提前感谢您的帮助!
编辑:
我选择的答案解决了添加和删除的问题,但BindingList对象无法排序,这对我来说是必要的。我找到了一个解决方案,其中通过继承BindingList并添加排序功能来构建自定义类,但我想知道是否有更简单的解决方案。
有关如何轻松解决此问题的任何建议?
1个回答

16

最简单的方法是使用BindingList,示例如下:

private List<string> mAllianceList = new List<string>();
private BindingList<string> bindingList;    

private void FillAllianceList()
{
    // Add alliance name to member alliance list
    foreach (Village alliance in alliances)
    {
        mAllianceList.Add(alliance.AllianceName);
    }

    bindingList = new BindingList<string>(mAllianceList);

    // Bind alliance combobox to alliance list
    this.cboAlliances.DataSource = bindingList;
}

从这里开始,只需处理绑定列表以添加和删除其中的项目。这将同时从列表和组合框中删除它。

编辑:为了回答您有关排序的问题,我想最简单(但可能有些“hacky”的方法)是这样的:

mAllianceList.Sort();
bindingList = new BindingList<string>(mAllianceList);
this.cboAlliances.DataSource = bindingList;

基本上,排序后,您创建一个新的绑定列表并重置数据源。也许有更优雅的方法,但是这应该可以工作。


太好了!它适用于添加和删除。现在我正在寻找排序,因为BindingList没有Sort方法。 - Fueled
4
我遇到了类似的问题,是将ComboBox DataSource与List<>链接时出现了问题(不过我的List<>中是List<MyCustomClass>而不是List<string>)。我尝试了这个解决方案,但是当向List<>添加新项时出现了问题(即没有更新)。最终我通过完全省略List<>,直接向BindingList<>添加元素来解决了该问题。 - benrwb
如果BindingList不可用,有没有强制更新组合框的方法?(我必须使用通用列表,因为BindingList是一个更简单的对象,没有我们需要的一些Linq方法,比如.RemoveAll()) - NickG

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