将多个ComboBox绑定到单个列表 – 问题:当我选择一个项目时,所有combobox都会更改

我正在动态创建一个ComboBox数组,所有ComboBoxDataSource都是一个包含一些整数的整数列表。 但是当我在任何一个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分享了原因和解决方案。