c#databound combobox更改其他控件中的数据

时间:2014-10-24 16:35:20

标签: c# .net winforms combobox

我再次提出一个非常复杂的问题,所以我会尽力解释:

我有一个c#windows窗体(.net 4)程序。我的窗体包含一个大的空白面板。 在这个程序中,我有一个带有设计器的windows form usercontrol类。 usercontrol是一个包含2个组合框和一个文本框的框。 (称之为菜单选择)

usercontrol上的每个组合框都使用以下命令绑定到不同的数据源:

comboBoxSelection1.Datasource = SelectionList1;
comboBoxSelection2.Datasource = SelectionList2;

当用户使用组合框选择项目时,文本框会显示他们的选择。例如。选择1:牛排,选择2:芯片。

该程序的整个要点是允许用户创建多个用户控件(菜单选项),每个用户控件具有不同的选择,从而产生一个选择列表(成为一个单一订单)。

到目前为止我? 在我开始为组合框使用数据源之前,这个工作绝对正常,如下所示:

object[] comboBoxList1 = new object[SelectionList1.Count];
int i = 0;
foreach (Selection s in SelectionList1)
{
    string description = s.Description;
    comboBoxList1[i] = description;
    i++;
}
    comboBoxSelection1.Items.AddRange(comboBoxList1);

但是,我需要使用数据源以便按ID区分项目(某些显示的名称相同 - 我无法更改)

我现在正在使用以下内容:

comboBoxSelection1.DataSource = SelectionList1;
comboBoxSelection1.ValueMember = "Code";
comboBoxSelection1.DisplayMember = "Name";

问题在于,每当我在其中一个usercontrols上更改comboBoxSelection1时,面板上每个usercontrol上的comboBoxSelection1值都会更改为我当前的选择。 comboBoxSelection2也是如此,如果我更改任何comboBoxSelection2中的值,则所有comboBoxSelection2框都会更改为相同的值。

这是一个使用一个数据源进行多个控件的错误吗? 这里有人看到: https://social.msdn.microsoft.com/forums/windows/en-us/3c5e8653-48aa-422c-8b6c-f80a09dfd62a/data-bound-combobox-list-item-changed-when-i-select-another

在这种情况下,问题通过使用数据绑定而不是数据源来解决(如下所示:ComboBox SelectedItem vs SelectedValue) 但是当我尝试这个代码时,我的组合框项目列表仍然是空的:

BindingSource comboBoxSelection1Binding = new BindingSource();
comboBoxSelection1.DataSource = SelectionList1;
comboBoxRuleCustomerGroup.DataBindings.Add("SelectedValue", comboBoxSelection1, "Name", true, DataSourceUpdateMode.OnPropertyChanged);

有什么想法吗?对于这个过于复杂的问题感到抱歉,我不得不编写过于复杂的程序!

3 个答案:

答案 0 :(得分:3)

在周末深入思考后,进行了更详细的搜索。我之前搜索的问题是不知道发生了什么。我现在意识到,当尝试将多个组合框绑定到同一个数据集时,这是一个问题。

终于发现了这个: Multiple ComboBox controls from the same Dataset

答案是添加以下行:

comboBoxSelection1.BindingContext = new BindingContext();

归功于Blind Fury / John Saunders和Bytes.com。

答案 1 :(得分:1)

您可以尝试将从object []开始的代码片段重构为传递给ComboBox控件和SelectionList的自己的方法。

private void PopulateList(ComboBox boxToPopulate, List<String> selectionList)
{
    object[] comboBoxList1 = new object[selectionList.Count];
    int i = 0;
    foreach (Selection s in selectionList)
    {
        string description = s.Description;
        comboBoxList1[i] = description;
        i++;
    }
    boxToPopulate.Items.AddRange(comboBoxList1);
}

使用此方法,您可以拥有无​​限数量的ComboBox并唯一填充它们。

答案 2 :(得分:1)

如果您想完全避免使用Datasource

您可以将项目添加为类而不是fx

ComboBox1.Items.Add(new MyClass("Name", 1))

然后有班级

public class MyClass
    {
        private readonly string _Navn;
        public MyClass(string name, Int id)
        {
            Id = id;
            Name = name;
        }
        public int Id{ get; }
        public override string ToString()
        {
            return Name;
        }
    }

然后当你需要访问你喜欢的id时。

(ComboBox1.SelectedItem as MyClass).Id