Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#数据绑定组合框更改其他控件中的数据_C#_.net_Winforms_Combobox_Datasource - Fatal编程技术网

C#数据绑定组合框更改其他控件中的数据

C#数据绑定组合框更改其他控件中的数据,c#,.net,winforms,combobox,datasource,C#,.net,Winforms,Combobox,Datasource,我又一次遇到了一个非常复杂的问题,因此我将尽力解释: 我有一个C#Windows窗体(.NET 4)程序。我的Windows窗体包含一个大的空白面板。 在这个程序中,我有一个带有设计器的Windows窗体UserControl类。用户控件是一个包含两个组合框和一个文本框的框(称之为菜单选项) 用户控件上的每个组合框都使用以下命令绑定到不同的数据源: comboBoxSelection1.DataSource = SelectionList1; comboBoxSelection2.DataSou

我又一次遇到了一个非常复杂的问题,因此我将尽力解释:

我有一个C#Windows窗体(.NET 4)程序。我的Windows窗体包含一个大的空白面板。
在这个程序中,我有一个带有设计器的Windows窗体UserControl类。用户控件是一个包含两个组合框和一个文本框的框(称之为菜单选项)

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

comboBoxSelection1.DataSource = SelectionList1;
comboBoxSelection2.DataSource = SelectionList2;
当用户使用组合框选择项目时,文本框将显示他们的选择。
例如,选择1:牛排,选择2:薯条

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

到目前为止还和我在一起吗?
在我开始为组合框使用DataSource之前,它工作得非常好,如下所示:

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";
问题是,每当我更改其中一个用户控件上的comboBoxSelection1时,面板上每个用户控件上的comboBoxSelection1值都会更改为当前选择。comboBoxSelection2也会发生同样的情况。如果我更改任何ComboxSelection2中的值,则所有ComboxSelection2框都会更改为相同的值

将一个数据源用于多个控件是一个错误吗?
在这里可以看到:

在这种情况下,问题是通过使用数据绑定而不是数据源解决的。
如图所示:

但当我尝试此代码时,我的组合框项目列表仍然为空:

BindingSource comboBoxSelection1Binding = new BindingSource();
comboBoxSelection1.DataSource = SelectionList1;
comboBoxRuleCustomerGroup.DataBindings.Add("SelectedValue", comboBoxSelection1, "Name", true, DataSourceUpdateMode.OnPropertyChanged);
有什么想法吗?

对不起,这个问题太复杂了,我一直在写太复杂的程序

您可以尝试将从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);
}
private void PopulateList(组合框topopulate,列表选择列表)
{
object[]comboBoxList1=新对象[selectionList.Count];
int i=0;
foreach(选择列表中的选择)
{
字符串描述=s.描述;
comboBoxList1[i]=说明;
i++;
}
boxToPopulate.Items.AddRange(组合框列表1);
}

使用这种方法,您可以拥有无限数量的组合框,并且可以唯一地填充它们。

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

最终发现:

答案是添加一行:

comboBoxSelection1.BindingContext = new BindingContext();

如果您想完全避免使用数据源,请访问Blind Fury/John Saunders和Bytes.com。

您可以将项目添加为类,而不是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

感谢您的想法,但是我不得不切换到数据绑定,而不是将描述单独添加到组合框中的原因是,一些描述是相同的,但具有不同的ID。不幸的是,这是一个完全不受我控制的列表,而且这些重复的名称是不可避免的(我仅以食物菜单为例,我的工作数据集要复杂得多)。在组合框中选择的描述需要绑定到所选项目的唯一id。不幸的是,这就是我真正需要使用数据绑定的原因。