2010-09-16 117 views
3

我有一個綁定到列表的組合框(Windows窗體)。它是在設計時創建的。當List內容改變時,我的代碼調用一個函數來刷新數據綁定。 這對於.NET 3.5正常工作:在C#和.NET 4.0中刷新組合框數據綁定

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

我已經切換到.NET 4.0,它已停止工作。特別是在通過這段代碼之後,VS調試器顯示BindingData.DataSource引用一個包含127個項目的列表,但ComboBox Items屬性包含零個項目。

看到這個SO問題沿着一個類似的主題:ComboBox Items Count Doesn't Match DataSource

我試過了所有我能想到的東西。目前我的代碼如下所示,仍然不起作用:

BindingData.SuspendBinding(); 
DataSource = null; 
DataSource = BindingData; 
BindingData.ResumeBinding(); 
BindingContext Dummy = this.BindingContext; 
Invalidate(); 
PerformLayout(); 

我試過從列表切換到BindingList,並沒有幫助。我不得不根據自己的意願從.NET 3.5切換到.NET 4.0,所以這非常令人沮喪。我確定有一個特定的序列可行。有任何想法嗎?

這是怎麼了,我的數據源連接到ComboBox:

private BindingSource BindingData = new BindingSource(); 

BindingData.DataSource = Nodes; 
DataSource = BindingData; 

感謝,安迪

+0

這似乎是Windows.Forms的......掉落列表標籤中贊成winforms標籤。 – Randolpho 2010-09-16 17:15:49

+0

如果你評論Suspen/ResumeLayout呢? – 2010-09-16 17:21:14

+0

無變化 - 列表仍爲空。 – Andy 2010-09-16 17:27:13

回答

1

我解決它。我想在某些時候,我做了我認爲是一個小變化,但實際上並沒有。此代碼從ComboBox顯示時被調用移動到創建時。它還沒有句柄,所以無法刷新數據綁定。

我在ComboBox.HandleCreated事件中再次刷新了數據綁定,它可以工作。

謝謝,安迪

0

爲什麼你暫停和恢復BindingSource?如果你只是改變你的數據源,就不會有性能上的問題。

0

根據How to: Bind a Windows Forms ComboBox or ListBox Control to Data您可以使用組合框的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 

「長度」是指String類的公共財產。更好的做法是直接引用字符串字符的屬性。 String唯一剩下的公共財產是Chars,但我無法完成工作。因此,我們將DisplayMember重置爲comboBox.DisplayMember = "",導致ComboBox調用每個List項目的(a StringToString method =>問題解決。

不是字符串列表條目可以通過組合框的屬性DisplayMemberValueMember處理(它們也適用於其他控件): DisplayMember & ValueMember