当数据源更改时,ComboBox不会自动更新
本文关键字:更新 ComboBox 数据源 | 更新日期: 2023-09-27 18:08:21
由于某些原因,当从数据源(一个简单的BindingList)添加或删除项目时,组合框会相应地更新,但如果我像这样编辑一个项目,它不会自动更新:
myBindingList[index].Name = "NewName";
myBindingList[index].Value = newValue;
为了让它更新,当我编辑一个项目,而不是创建或删除一个项目,我必须这样做后,更改:
myComboBox.DataSource = null;
myComboBox.DataSource = myBindingList;
这解决了问题,但它似乎是一个相当混乱的解决方案。此外,对于大列表,它可能会变得很慢(我知道过早的优化),但仍然有一种方法来强制ComboBox更新而不完全重新分配其数据源?
这在MSDN论坛中有说明:
IBindingList接口包含ListChanged事件,其中像组合框这样的控件连接到底层数据源分配给它实现上述接口。您的数据源必须用适当的ListChangeEventArgs引发相应的ListChanged当你添加、删除、更改你的IBindingList实现者时。这样,每当您使用的底层源绑定到您的,则对应的UI控件(组合框)为刷新。
你说你正在使用BindingList,事实上你确实得到了组合框来反映添加或删除项目事件。我认为你应该用另一种方式更新已经在BindingList中的项目,因为看起来正确的BindingList事件没有触发。
你可以调查一下或者简单地重置和重新分配数据源,我认为不是太糟糕,你是在有状态的Windows窗体应用程序中而不是在无状态的Webforms中所以你的对象总是在那里:)
你需要可观察集合和IPropertyChange实现:
绑定到ObservableCollection的ComboBox不更新
我有一个类似的问题,组合框不会填充它的选项列表,因为对象没有被渲染。导致"索引无效";运行第一个示例时出现错误。我通过在设置索引之前显示控件来解决这个问题。
ComboBox cb = new ComboBox() {
DataSource = DataSource,
};
cb.SelectedIndex = index;
this.Controls.Add(cb);
cb.Update();
为:
ComboBox cb = new ComboBox();
this.Controls.Add(cb);
cb.Update();
cd.DataSource = DataSource
cb.SelectedIndex = index;