我再次提出一个非常复杂的问题,所以我会尽力解释:
我有一个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);
有什么想法吗?对于这个过于复杂的问题感到抱歉,我不得不编写过于复杂的程序!
答案 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