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