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

ComboBox 已设置 DataSource 但未显示任何项目

C#WinForm中comboBox的DataSource获取数据是显示System.Data.DataRowView

在没有DataSource的ComboBox上设置DisplayMember和ValueMember

绑定到 DataSource 的 ComboBox 需要添加默认值(空白或在此处添加)和设置回退的能力