2012-01-04 116 views
5

我正在開發一個小型桌面應用程序,並且在窗體上有幾個下拉列表(組合框)。我填充一個字符串列表,它將被用作所有字符串的數據源。下面是我的Form.cs類的例子:Windows窗體組合框控件的奇怪行爲

List<string> datasource = new List<string>(); 
datasource.Add("string 1"); 
datasource.Add("string 2"); 

然後我設置列表作爲數據源到幾個組合框:

cmbDataType1.DataSource = datasource; 
cmbDataType2.DataSource = datasource; 

這一切都發生在相同的方法,它是從表單稱爲構造函數。 這裏是一個奇怪的部分:在我改變其中一個選定的值後,相同的值將被設置在另一個值中。沒有設置SelectedIndexChange事件。我已經搞砸了某處,但我不能把我的手指放在哪裏...

+1

這裏是[到博客文章的鏈接](http://blogs.msdn.com/b/bethmassi/archive/2007/09/19/ binding-multiple-comboboxes-to-the-same-datasource.aspx),談論這一些。這是關於vb.net,但行爲的描述應該是相同的任何方式。 – 2012-01-04 15:10:50

+0

它真的澄清了一些事情,謝謝你。 – 2012-01-04 20:33:09

回答

10

您看到的行爲是通過設計。當您綁定與多個控件的數據源相同的對象時,所有控件共享相同的綁定源。

如果你明確指定一個新的綁定源各控制,即使使用相同的數據源,所有控件都將被解放,將起到相互獨立:

cmbDataType1.DataSource = new BindingSource(datasource, ""); 
cmbDataType2.DataSource = new BindingSource(datasource, ""); 
+0

很好,謝謝。 – 2012-01-04 20:30:49

3

由於您綁定到相同的確切datasource這是預期的行爲。如果您不希望所選項目發生更改,您需要將綁定更改爲綁定或使用不同的對象。

+0

雖然它仍然很好奇。數據源是一個字符串列表。組合框2如何知道組合框1中選定的索引已更改?沒有辦法將該信息存儲在列表中。 – 2012-01-04 00:54:19

+0

這只是綁定到數據源的魔力。改變combobox1中的索引是告訴數據源移動其內部指針,這又觸發combobox2中的變化。 – 2012-01-04 01:13:32

+0

我只是試圖爲我自己的好奇心鍛鍊實現...所以我想象他們將數據源結構中的列表包含在所需的bookeeping數據中,像「當前項目」之類的東西。這兩個組合框如何引用相同的包裝?我假設他們都會在他們各自的'DataSource'屬性被設置時創建一個,這意味着通信將不起作用。有趣... – 2012-01-04 01:21:33

4

你應該設置一個新的BindingContext下一次綁定dataSource之前的控件:

cmbDataType1.BindingContext = new BindingContext(); 
cmbDataType1.DataSource = datasource; 

cmbDataType2.BindingContext = new BindingContext(); 
cmbDataType2.DataSource = datasource; 
+0

感謝您的快速回復,它就像一個魅力! :d – 2012-01-04 20:31:44