将多个ComboBox绑定到单个列表 – 问题:当我选择一个项目时,所有combobox都会更改
我正在动态创建一个ComboBox
数组,所有ComboBox
的DataSource
都是一个包含一些整数的整数列表。 但是当我在任何一个combobox中更改值X时,所有其他组合值都会重置为值X.
由于您将所有combobox绑定到同一个数据源(单个列表),因此它们使用单个BindingManagerBase
。
因此,当您从其中一个combobox中选择项目时,共享绑定管理器基础的当前Position
更改,并且所有combobox都会转到其共享数据源的该位置。
要解决此问题,您可以将它们绑定到不同的数据源:
-
您可以将它们绑定到
yourList.ToList()
或任何其他列表,例如不同的BindingList
。combo1.DataSource = yourList.ToList(); combo2.DataSource = yourList.ToList();
-
您可以为它们使用不同的
BindingSource
,并将列表设置为BindingSource的DataSource
combo1.DataSource = new BindingSource { DataSource= yourList}; combo2.DataSource = new BindingSource { DataSource= yourList};
另外作为另一种选择:
-
您可以为combobox使用不同的
BindingContext
。 这种方式即使将它们绑定到单个列表,它们也不再同步。combo1.BindingContext = new BindingContext(); combo1.DataSource = yourList; combo2.BindingContext = new BindingContext(); combo2.DataSource = yourList;
事实上,表单的所有控件都使用共享的BindingContext
。 当您将2个控件绑定到同一个数据源时,它们也会以这种方式使用相同的BindingManagerBase
,例如,当您移动到下一个记录时,所有控件都移动到下一个记录下一个记录的绑定属性的显示值。 这与您从combobox中看到的行为相同。 对同一个使用相同BindingManagerBase
控件进行同步是一种理想的行为。 无论如何,有时我们不需要这样的行为。 该post分享了原因和解决方案。