DataSource 更改时,ComboBox 不会自动更新?
Posted
技术标签:
【中文标题】DataSource 更改时,ComboBox 不会自动更新?【英文标题】:ComboBox doesn't automatically update when DataSource changes? 【发布时间】:2011-11-14 20:14:39 【问题描述】:由于某种原因,当从 DataSource(一个简单的 BindingList)中添加或删除项目时,ComboBox 会相应更新,但如果我像这样编辑项目,它不会自动更新:
myBindingList[index].Name = "NewName";
myBindingList[index].Value = newValue;
为了在我编辑项目而不是创建或删除项目时更新它,我必须在更改后执行此操作:
myComboBox.DataSource = null;
myComboBox.DataSource = myBindingList;
这解决了问题,但它似乎是一个相当混乱的解决方案。同样对于大型列表,它可能会变得很慢(我知道过早的优化),但仍然有办法强制 ComboBox 更新而不完全重新分配其 DataSource?
感谢阅读。
【问题讨论】:
【参考方案1】:您需要可观察的集合和 IPropertyChange 实现:
ComboBox bound to a ObservableCollection does not update
【讨论】:
这家伙说的是 Windows 窗体而不是 WPF。【参考方案2】:这在 MSDN 论坛中有说明:
IBindingList 接口包含 ListChanged 事件,其中 如果基础数据源连接到组合框等控件 分配给它实现所述接口。您的数据源必须 如果使用适当的 ListChangeEventArgs 引发相应的 ListChanged 您添加、删除、更改等您的 IBindingList 实现者。 这样,每当你用来绑定到你的底层源 组合框改变了,对应的UI控件(组合框)是 刷新。
您说您正在使用 BindingList,实际上您确实获得了组合框来反映添加或删除项目事件。我认为您应该以另一种方式更新 BindingList 中已有的项目,因为看起来正确的 BindingList 事件没有触发。
您可以对此进行调查,也可以简单地使用 reset 并重新分配 DataSource,我不认为这太糟糕了,您在 Statefull Windows Forms 应用程序中而不是在 SatetLess Webforms 中,所以您的对象一直都在那里: )
【讨论】:
以上是关于DataSource 更改时,ComboBox 不会自动更新?的主要内容,如果未能解决你的问题,请参考以下文章
为啥设置 DataSource 时 ComboBox 不抛出异常?
ComboBox 已设置 DataSource 但未显示任何项目
C#WinForm中comboBox的DataSource获取数据是显示System.Data.DataRowView