组合框是链接的(这很糟糕)

时间:2015-10-28 07:13:55

标签: c# winforms combobox

我正在做简单的WinForms应用程序,我面临一些奇怪的问题。

我的表单:

enter image description here

它很简单: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;)对所有三个组合框执行更改。我做错了什么?

2 个答案:

答案 0 :(得分:10)

您正在运行WinForms背景中存在的名为“CurrencyManager”的内容。

它的工作是在引用同一数据源的所有可绑定控件之间同步“当前记录”。

例如,如果您添加了一个标签并将其绑定到同一个列表,并绑定它以便它显示其中一个对象的属性,它将始终显示您在中选择的同一对象的属性值组合框。

这样做的一个好处是,您可以轻松添加一个表单来编辑对象列表,将文本框等绑定到其中一个对象的属性,并添加一个允许您移动到下一行或上一行的导航器。您不必手动确保所有文本框都引用正确的对象,CurrencyManager将为您完成所有这些操作。

但是,在您的情况下,由于您将相同的数据源绑定到所有三个组合框,因此CurrencyManager将确保所有三个选择同一行。如果在其中一个组合框中选择一个新行,则CurrencyManager将会修复所有其他组以引用同一行。

您可以通过各种方式解决此问题:

  1. 您可以覆盖每个组合框的绑定上下文:

    comboBox2nd.BindingContext = new BindingContext();
    comboBox3rd.BindingContext = new BindingContext();
    

    请注意,如果您选择此路线,则需要在分配SelectedIndex或SelectedItem属性之前执行此操作,否则CurrencyManager将在您分配新的BindingContexts之前更新其他两个组合框。

  2. 您可以为每个组合框分配不同的数据源:

    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。