我注意到当两个组合框共享相同的数据源(例如DataTable
)时,它们将共享相同的选定索引。
我想知道这种行为是如何实现的。
当“当前行”或“活动行”发生变化时,感觉DataTable
触发某种事件,并且绑定到它的组合框捕获事件并进行相应的更改。但是,当我使用像List
这样的数据源时,我看到了这个事件,它也有效。
实际上我想让RadioButton与两个组合框同步更新,我应该如何实现呢?
我在网上看到的问题主要涉及如何将组合框与同一数据源去同步,例如Multiple Combo Boxes With The Same Data Source (C#)和Binding two combo boxes to the same data source,that each combo will have individual behaviour,Share ComboBox DataSource。
答案 0 :(得分:1)
此行为由BindingContext Class实施。关键部分是:
对于Windows窗体上的每个数据源,只有一个CurrencyManager或PropertyManager。
如果您设置了ComboBox
(或ListControl
' s)数据源,它会将自己注册到包含Control
' s {{ 1}}所以它将与其BindingContext
进行通信。当两个CurrencyManager
注册具有相同的数据源时,它们会收到相同的ListControl
。
您可以通过
进行检查CurrencyManager
如果您更改 one 组合框的选定项目,这将在输出窗口中显示三个相同的哈希码。
这也说明了为什么没有"捷径"到this.comboBox1.BindingContext[lst].CurrentChanged += Form1_CurrentChanged;
this.comboBox2.BindingContext[lst].CurrentChanged += Form1_CurrentChanged;
this.BindingContext[lst].CurrentChanged += Form1_CurrentChanged;
void Form1_CurrentChanged(object sender, EventArgs e)
{
Debug.WriteLine(((CurrencyManager)sender).GetHashCode());
}
的值,因为它没有与RadioButton
进行通信(它不是CurrencyManager
)。您必须编写代码以将其值与组合框的当前值同步。
答案 1 :(得分:0)
这是一种方法:
创建一个BindingSource
,您可以将常用 DataSource
用于 ComboBoxes
。所以它们仍然是耦合的,但与正常的BindingSource
相关联,而不是隐藏的默认值:myBS = new BindingSource(myDT, myDT.Columns[myColumn].ColumnName);
在Position
中添加更改事件:myBS .PositionChanged += myBS_PositionChanged;
将代码放入事件中以控制RadioButton
..
事件代码中的逻辑取决于您;这是一个例子:
void myBS_PositionChanged(object sender, EventArgs e)
{
radioButton1.Checked = myBS.Current.ToString() == "2";
}