2012-01-04 68 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