分享ComboBox DataSource

时间:2011-02-01 10:39:08

标签: c# winforms combobox

我可以问为什么两个组合框都会相互触发,以便两者具有相同的值? 我不能共享一个列表,并且有两个组合框具有不同的选定文本吗?

private void Form1_Load(object sender, EventArgs e)
    {
        BindingList<string> list = new BindingList<string>();
        list.Add("A");
        list.Add("B");
        list.Add("C");
        list.Add("D");

        bind(cbo1, list);
        bind(cbo2, list);
    }

    private void bind(ComboBox combobox, BindingList<string> list)
    {
        // commented lines are in actual code,
        // but appears unimportant in this question
        //combobox.DropDownStyle = ComboBoxStyle.DropDown;
        //combobox.AutoCompleteSource = AutoCompleteSource.ListItems;
        //combobox.AutoCompleteMode = AutoCompleteMode.Suggest;
        combobox.DataSource = list;
        //combobox.Focus();
        //combobox.Text = string.Empty;
        //combobox.SelectedText = string.Empty;
    }

更新: 好的,现在我发现问题是DataSource由一些BindingContext和CurrencyManager管理,以自动同步列表。但我觉得有人必须知道如何禁用这种行为。

我不希望使用2个不同的列表,因为我希望能够在运行时修改此单个列表,并将更改反映在所有ComboBox上。任何实现这一目标的方法都将非常感激。

2 个答案:

答案 0 :(得分:8)

你可以像这样“解决”它:

// combobox.DataSource = list;
var curr = new BindingSource(list, null);        
combobox.DataSource = curr;

默认的BindingSource(Currencymanager)链接到每个Form,使2 cbx保持同步。但我不确定这里的具体规则是什么。我甚至不确定以上是否是个好主意。

对于小型列表,我只会制作单独的副本。

答案 1 :(得分:0)

对于2个单独的组合框,您不能使用与数据源相同的对象。您应该定义list1list2,并为每个组合框填充每个组合框。使用相同的数据源意味着一个组合框中的选择反映在另一个组合框中。