我正在做简单的WinForms应用程序,我面临一些奇怪的问题。
我的表单:
它很简单:3个组合框和两个按钮 - 确定和取消。
查看:
private void applyOrderButton_Click(object sender, EventArgs e)
{
List<string> testList = new List<string>()
{
"A",
"B",
"C"
};
comboBox1st.DataSource = testList;
comboBox2nd.DataSource = testList;
comboBox3rd.DataSource = testList;
comboBox1st.SelectedIndex = 2;
comboBox2nd.SelectedIndex = 1;
comboBox3rd.SelectedIndex = 0;
//Presenter.DoTest();
}
在训练方法applyOrderButton_Click()
之后会发生什么(单击Ok按钮后会发生)我的所有组合框都会更改所选位置。但是,这些组合框中的每一个都具有相同的选定索引 - 在这种特殊情况下,它将是&#34; A&#34;。
然后我使用我的cursour更改了更改comboBox selectedIndex(例如我选择第3个comboBox来显示&#34; C&#34;)对所有三个组合框执行更改。我做错了什么?
答案 0 :(得分:10)
您正在运行WinForms背景中存在的名为“CurrencyManager”的内容。
它的工作是在引用同一数据源的所有可绑定控件之间同步“当前记录”。
例如,如果您添加了一个标签并将其绑定到同一个列表,并绑定它以便它显示其中一个对象的属性,它将始终显示您在中选择的同一对象的属性值组合框。
这样做的一个好处是,您可以轻松添加一个表单来编辑对象列表,将文本框等绑定到其中一个对象的属性,并添加一个允许您移动到下一行或上一行的导航器。您不必手动确保所有文本框都引用正确的对象,CurrencyManager将为您完成所有这些操作。
但是,在您的情况下,由于您将相同的数据源绑定到所有三个组合框,因此CurrencyManager将确保所有三个选择同一行。如果在其中一个组合框中选择一个新行,则CurrencyManager将会修复所有其他组以引用同一行。
您可以通过各种方式解决此问题:
您可以覆盖每个组合框的绑定上下文:
comboBox2nd.BindingContext = new BindingContext();
comboBox3rd.BindingContext = new BindingContext();
请注意,如果您选择此路线,则需要在分配SelectedIndex或SelectedItem属性之前执行此操作,否则CurrencyManager将在您分配新的BindingContexts之前更新其他两个组合框。
您可以为每个组合框分配不同的数据源:
combobox2nd.DataSource = testList.ToList();
combobox3rd.DataSource = testList.ToList();
答案 1 :(得分:7)
只需将新上下文分配给其他类似的ComboBox:
List<string> testList = new List<string>()
{
"A",
"B",
"C"
};
comboBox1st.DataSource = testList;
comboBox2nd.BindingContext = new BindingContext();
comboBox2nd.DataSource = testList;
comboBox3rd.BindingContext = new BindingContext();
comboBox3rd.DataSource = testList;
comboBox1st.SelectedIndex = 2;
comboBox2nd.SelectedIndex = 1;
comboBox3rd.SelectedIndex = 0;
CurrencyManager用于保持数据绑定控件彼此同步(显示来自同一记录的数据)。 CurrencyManager对象通过管理数据源提供的绑定数据的集合来完成此操作。对于与Windows窗体关联的每个数据源,该窗体至少维护一个CurrencyManager。由于可能有多个与表单关联的数据源,因此BindingContext对象管理任何特定表单的所有CurrencyManager对象。更广泛地说,所有容器控件都至少有一个BindingContext对象来管理他们的CurrencyManagers。