C# WinForms组合框未删除项

C# WinForms组合框未删除项,c#,winforms,C#,Winforms,我正在为学校编写一个WinForms应用程序,其中向用户显示一面旗帜,用户必须从组合框中选择适当的国家。我正在使用类型标志列表作为组合框的数据源 List<Flag> flags; comboBox.DataSource = flags; 我发现该标志正在从列表中删除,但没有从组合框中删除。我哪里出错了?像这样做 flags.Remove(currentFlag); comboBox.DataSource = null; comboBox.DataSource = flags;

我正在为学校编写一个WinForms应用程序,其中向用户显示一面旗帜,用户必须从组合框中选择适当的国家。我正在使用类型标志列表作为组合框的数据源

List<Flag> flags;
comboBox.DataSource = flags;
我发现该标志正在从列表中删除,但没有从组合框中删除。我哪里出错了?

像这样做

flags.Remove(currentFlag);
comboBox.DataSource = null;
comboBox.DataSource = flags;

这里的根本问题是,当ComboBox的数据源发生更改时,它没有收到任何类型的通知,因此显然它没有按照应有的方式进行可视化刷新,因为它没有意识到发生了任何事情

不太理想的解决方案是Sajeetharan建议的,删除列表,然后再次添加。这将迫使控件再次读取整个列表,从而“捕获”更改,删除现在缺少的项

更好的解决方案是使用适当的集合类型,该集合类型向控件提供更改通知,并允许它根据需要重新绘制。这就是这次会议的目的。通常建议在为绑定而不是普通列表设置数据源时使用此选项

简而言之,您的代码将变成:

BindingList<Flag> flags = new BindingList<Flag>();
comboBox.DataSource = flags;

数据绑定引擎负责从组合中删除项目。

谢谢您的帮助!我按照你的建议做了,但是显示屏上的项目显示不正确。我的所有项目都显示为flagquick.Flag。在设置数据源之前,我再次尝试设置绑定源,现在它似乎可以工作了。再次感谢你的帮助@dag623您确定要删除该项目吗?告诉我们如何获得currentFlag对象是的,它被删除在我的列表中,因为这是我的第一个预感。我设置了一个断点并验证了我的列表是否正在更新。谢谢你的意见!这看起来是一个很好的解决方案。我将尝试这种方法。非常感谢。工作得很有魅力!再次感谢!
BindingList<Flag> flags = new BindingList<Flag>();
comboBox.DataSource = flags;
flags.Remove(currentFlag);