winforms ComboBox在DataSource更改时不会自动更新?

mzaanser  于 2023-05-01  发布在  其他
关注(0)|答案(3)|浏览(315)

出于某种原因,当从DataSource(一个简单的BindingList)中添加或删除项目时,ComboBox会相应地更新,但如果我像这样编辑一个项目,它不会自动更新:

myBindingList[index].Name = "NewName";
myBindingList[index].Value = newValue;

为了让它在我编辑一个项目时更新,而不是创建或删除一个项目,我必须在更改后这样做:

myComboBox.DataSource = null;
myComboBox.DataSource = myBindingList;

这解决了问题,但它似乎是一个相当混乱的解决方案。同样,对于大列表,它可能会变得很慢(我知道过早的优化),但仍然有一种方法可以强制ComboBox更新而不完全重新分配其数据源?
感谢阅读。

mwngjboj

mwngjboj1#

在MSDN论坛中有这样的说法:
IBindingList接口包含ListChanged事件,如果分配给它的底层数据源实现了上述接口,那么combobox这样的控件将挂接到该事件中。如果你添加、删除、更改等,你的数据源必须用正确的ListChangeEventArgs引发相应的ListChanged。您的IBindingList实现程序。这样,每当用于绑定到组合框的基础源代码发生更改时,相应的UI控件(组合框)就会刷新。
你说你正在使用BindingList,事实上你确实得到了combobox来反映添加或删除条目事件。我认为你应该用另一种方式更新BindingList中已经存在的项目,因为看起来像是正确的BindingList事件没有触发。
你可以调查一下,或者简单地接受重置并重新分配数据源,我不认为这太糟糕,你是在Stateful Windows Forms应用程序中,而不是在SatetLess WebForms中,所以你总是有你的对象:)

guz6ccqo

guz6ccqo3#

我也遇到过类似的问题,因为对象没有被渲染,所以组合框不会填充它的选项列表。导致第一个示例运行时出现“索引无效”错误。我通过在设置索引之前显示控件来解决这个问题。

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;

相关问题