2016-10-01 43 views
1

我正在写一个WinForms应用程序的学校用户显示一个标志,必须从组合框中选择适当的国家。我使用的类型标志为数据源的组合框的列表...WinForms Combobox没有删除项目

List<Flag> flags; 
comboBox.DataSource = flags; 

一个转身后,我从列表中删除以前的标志和更新组合框的DataSource ...

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

我发现该标志正在从列表中删除,但不是从组合框中删除。我哪里错了?

回答

0

根这里的问题是,组合框不接受任何形式的通知时,其数据源的变化,所以很明显它不会在视觉上,它应该刷新,因为它不没有意识到发生了什么。

不太理想的解决方案是什么Sajeetharan建议,删除列表althogether并再次添加它。这迫使控制重新读取整个列表,因此它“捕捉”了更改,删除了现在缺失的项目。

更好的解决方案是使用适当的集合类型,它向控件提供更改通知并允许根据需要重绘。这就是BindingList<T> class的目的。通常建议在为绑定设置数据源而不是普通列表时使用它。因此,在短期

,你的代码将成为:

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

之后,您只需删除其中一个项目:

flags.Remove(currentFlag); 

而数据绑定引擎需要从删除的产品负责组合。

+0

这看起来像一个很好的解决方案。我将尝试这种方法。谢谢! – dag623

+0

工作就像一个魅力!再次感谢! – dag623

2

像这样做,

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

谢谢你的帮助!我按照你的建议做了,但显示器中的项目没有正确显示。我的所有商品都显示为FlagQuiz.Flag。我在设置DataSource之前再次尝试设置绑定源,现在似乎正在工作。再次感谢你的帮助! – dag623

+0

@ dag623你确定该物品正在被删除吗?向我们展示如何获取currentFlag对象 – Sajeetharan

+0

是的,它已被删除,因为这是我的第一次预感。我设置了一个断点并验证了我的列表正在更新。感谢您的输入! – dag623