共享ComboBox数据源

11

我可以问一下为什么两个组合框会相互触发,以至于它们具有相同的值吗? 我不能共享一个列表并拥有不同选定文本的2个组合框吗?

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上反映出更改。任何能实现这一目标的方法都将不胜感激。


好的,我可以确认这一点。你可以(应该)将bind()简化为cbo1.DataSource = list; - H H
我不知道确切的原因,简化问题是为了更好地定义(缩小)问题。 - H H
@Henk 我刚刚缩小范围了!谢谢 =) - Jake
2个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
8
您可以这样“解决”它:
// combobox.DataSource = list;
var curr = new BindingSource(list, null);        
combobox.DataSource = curr;

每个窗体都有一个默认的BindingSource(Currencymanager)与之关联,它保持着两个cbx的同步。但我不确定这里的确切规则是什么。我甚至不确定上述方法是否可行。

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


我差点就要撞墙了。你让我设置“cbo1.DataSource = list”,而我把这行代码放在了Form_Load中,而bind()调用被注释掉了。所以当我尝试在bind()内使用BindingSource时,它没有起作用...另外,对于我的情况,list是不起作用的,必须使用BindingList。谢谢! - Jake

0

您不能将同一对象用作两个不同组合框的数据源。您应该定义list1list2,并使用每个列表填充每个组合框。如果使用相同的数据源,则一个组合框中的选择会反映在另一个组合框中。


谢谢提供信息,让我想出一个解决方案来解决我的具体问题,然后再回复您。 - Jake
1
这没有意义,不是吗?数据源只是项目列表,它不包含所选项目。那么,为什么一个组合框的所选项目应该决定使用相同数据源的另一个组合框的所选项目呢...? - TheBlastOne
@TheBlastOne 在这种情况下,数据源指的是列表将获取其下拉项列表的数据的位置。所以这是有意义的,至少我是这么认为的。另一个数据源指的是用户与之交互时界面将更新的内存位置。 - Jake

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,