在C#和.NET 4.0中刷新ComboBox数据绑定

3

我有一个ComboBox(Windows Forms),它绑定了一个列表。它是在设计时创建的。当列表内容更改时,我的代码调用一个函数来刷新数据绑定。这对于.NET 3.5来说很好用

BindingData.SuspendBinding();
DataSource = null;
DataSource = BindingData;
BindingData.ResumeBinding();

我已经切换到.NET 4.0,但它停止工作了。具体来说,在执行此代码后,VS调试器显示BindingData.DataSource引用了一个包含127个项目的列表,但ComboBox项属性却不包含任何项目。
可以参考类似主题的这个SO问题:ComboBox Items Count Doesn't Match DataSource
我已尝试了我能想到的一切方法。目前我的代码如下,但仍然无法正常工作:
BindingData.SuspendBinding();
DataSource = null;
DataSource = BindingData;
BindingData.ResumeBinding();
BindingContext Dummy = this.BindingContext;
Invalidate();
PerformLayout();

我尝试从List切换到BindingList,但这并没有帮助。我被迫不情愿地从.NET 3.5切换到.NET 4.0,所以这非常令人沮丧。我相信有一种特定的顺序可以解决问题。有什么想法吗?
这是我将数据源附加到ComboBox的方式:
private BindingSource BindingData = new BindingSource();

BindingData.DataSource = Nodes;
DataSource = BindingData;

感谢,安迪。

这似乎是Windows.Forms... 放弃列表标记,转而使用winforms标记。 - Randolpho
如果您将Suspen/ResumeLayout注释掉会怎么样? - H H
没有变化 - 列表仍然为空。 - Andy
3个回答

1

我解决了。我猜在某个时候,我做了一个我认为是小改变但实际上不是的事情。这段代码从被调用时ComboBox被显示到被创建时移动了。它还没有句柄,因此数据绑定无法刷新。

我在ComboBox.HandleCreated事件中再次添加了一次数据绑定的刷新,现在它可以工作了。

谢谢,Andy


0
为什么要暂停和恢复BindingSource?如果您只更改数据源,就不会出现性能问题。

0
根据如何:将 Windows Forms ComboBox 或 ListBox 控件绑定到数据,您可以使用ComboBox的DisplayMember属性:
//Sample for C++ .NET:
List<String^>^ options = gcnew List<String^>();
options->Add("Option 1");
options->Add("Option 2");

comboBox.DataSource = options;  
comboBox.DisplayMember = "Length";//this causes an DataSource update but the ComboBox would
                                  //show an item's length instead of the item itself
comboBox.DisplayMember = "";      //reset -> the ComboBox calls each List item's ToString
                                  //member

“Length”是String类的公共属性。更好的方法是直接引用字符串的字符的属性。 String的唯一剩余公共属性是Chars,但我无法使其正常工作。 因此,我们通过comboBox.DisplayMember = ""重置DisplayMember,导致ComboBox调用每个列表项(一个String)的ToString方法=>问题解决了。

除了字符串之外的其他列表条目可以通过ComboBox的属性DisplayMemberValueMember来处理(它们也适用于其他控件): DisplayMember & ValueMember


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接