将多个ComboBox绑定到单个列表 - 问题:当我选择项目时,所有组合框都会更改

Din*_*kti 3 c# combobox winforms

我正在ComboBox动态创建一个数组,而DataSourcefor all ComboBox是一个包含一些整数的整数列表.但是当我在任何一个组合框中更改值X时,所有其他组合值都会重置为值X.

Rez*_*aei 7

由于您将所有组合框绑定到同一个数据源(单个列表),因此它们使用单​​个数据源BindingManagerBase.

因此,当您从其中一个组合框中选择项目时,Position共享绑定管理器基础的当前更改,并且所有组合框都会转到其共享数据源的该位置.

要解决此问题,您可以将它们绑定到不同的数据源:

  • 您可以将它们绑定到yourList.ToList()任何其他列表,例如不同的列表BindingList<T>.

    combo1.DataSource = yourList.ToList();
    combo2.DataSource = yourList.ToList();
    
    Run Code Online (Sandbox Code Playgroud)
  • 您可以BindingSource为它们使用不同的设置,并DataSource从BindingSource开始设置列表

    combo1.DataSource = new BindingSource { DataSource= yourList};
    combo2.DataSource = new BindingSource { DataSource= yourList};
    
    Run Code Online (Sandbox Code Playgroud)

另外作为另一种选择:

  • 您可以BindingContext为组合框使用不同的.这种方式即使将它们绑定到单个列表,它们也不再同步.

    combo1.BindingContext = new BindingContext();
    combo1.DataSource = yourList;
    combo2.BindingContext = new BindingContext();
    combo2.DataSource = yourList;
    
    Run Code Online (Sandbox Code Playgroud)

事实上,表单的所有控件都使用共享BindingContext.当您将2个控件绑定到同一个数据源时,它们也会以相同的BindingManagerBase方式使用相同的方法,例如,当您移动到下一个记录时,所有控件都会移动到下一个记录的下一个记录的显示值.这与您从组合框中看到的行为相同.对使用相同控件的控件进行同步BindingManagerBase是期望的行为.无论如何,有时我们不需要这样的行为.该帖子分享了原因和解决方案.