2011-02-01 45 views
11

请问为什么这两个组合框相互触发,使得两者具有相同的价值观? 我不能共享一个列表,并有两个组合框和不同的选定文本?分享的ComboBox的DataSource

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; 
    } 

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

我不希望用2名不同的名单,因为我希望能够在运行时修改这个单一的列表,并有改变在所有组合框反映。任何方法来实现这一点将不胜感激。

+0

OK,我可以证实这一点。你可以(应该)简化`bind()的`只是`cbo1.DataSource =名单;` – 2011-02-01 10:47:40

+0

@Henk有什么需要注意的? – Jake 2011-02-01 10:48:50

+0

我不知道确切的原因,简化是更好地定义(缩小)问题。 – 2011-02-01 10:51:26

回答

7

可以“解决”这样的:

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

有链接到被保持2 CBX同步各自形成一个默认的BindingSource(CurrencyManager的)。但我不确定这里的确切规则是什么。我甚至不确定上述是否是一个好主意。

对于小名单,我只想做单独的副本。

0

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