ListBox选中项变更联动ComboBox选中项问题咨询
解决ListBox与ComboBox绑定同一数据源时选中项同步的问题
这问题我之前开发WinForms程序时也碰到过,其实根源在于WinForms控件默认的BindingContext共享机制:当你把同一个集合直接绑定到两个控件时,它们会自动共享同一个BindingManagerBase对象,这个对象负责跟踪数据源的当前选中位置,所以操作一个控件的选中项,另一个也会跟着同步变化,这就不符合你想要独立控制的需求啦。
下面给你两种简单有效的解决方法:
方法一:给其中一个控件单独设置BindingContext
直接给ListBox或ComboBox新建一个独立的BindingContext实例,让它脱离窗体默认的共享上下文:
public DetailsForm() { InitializeComponent(); var categories = TextSelectionSettings.Default.categories; // 先给ComboBox绑定数据源 this.categories_comboBox.DataSource = categories; // 给ListBox分配独立的BindingContext this.categories_listBox.BindingContext = new BindingContext(); // 再绑定数据源 this.categories_listBox.DataSource = categories; }
方法二:用独立的BindingSource包装数据源
这种方式更灵活,后续如果需要对其中一个控件的数据源做过滤、排序等操作都很方便,核心是给两个控件分别用不同的BindingSource来包裹同一个原始集合:
using System.Windows.Forms; // 记得引入这个命名空间 public DetailsForm() { InitializeComponent(); var categories = TextSelectionSettings.Default.categories; // 为ComboBox创建独立的BindingSource var comboBindingSource = new BindingSource(); comboBindingSource.DataSource = categories; this.categories_comboBox.DataSource = comboBindingSource; // 为ListBox创建独立的BindingSource var listBindingSource = new BindingSource(); listBindingSource.DataSource = categories; this.categories_listBox.DataSource = listBindingSource; }
两种方法都能实现让两个控件的选中状态完全独立,你可以根据自己的后续需求选择~如果之后需要对某个控件的展示数据做调整,方法二的扩展性会更好哦。
内容的提问来源于stack exchange,提问作者erotavlas
相关产品推荐
相关产品推荐

