我以这种方式填充组合框
foreach (Control c in this.Controls)
{
if (c is ComboBox)
{
(c as ComboBox).DataSource = DataSet1.Tables[0];
(c as ComboBox).DisplayMember = "Articles";
}
}
但问题是,当我在一个Combo中更改SelectedItem时 - 它在所有其他Combos中都会被更改?
答案 0 :(得分:13)
将它们分别绑定到DataSet1.Table [0]的单独实例。
IE)
foreach (Control c in this.Controls)
{
if (c is ComboBox)
{
DataTable dtTemp = DataSet1.Tables[0].Copy();
(c as ComboBox).DataSource = dtTemp
(c as ComboBox).DisplayMember = "Articles";
}
}
答案 1 :(得分:6)
更好的方法是使用DataView来避免重复数据。另外,如果可以避免,不要多次投射。
foreach (Control c in this.Controls)
{
ComboBox comboBox = c as ComboBox;
if (comboBox != null)
{
comboBox.DataSource = new DataView(DataSet1.Tables[0]);
comboBox.DisplayMember = "Articles";
}
}
修改强>
我刚刚意识到你可以用LINQ
做更干净的事foreach (ComboBox comboBox in this.Controls.OfType<ComboBox>())
{
comboBox.DataSource = new DataView(DataSet1.Tables[0]);
comboBox.DisplayMember = "Articles";
}
答案 2 :(得分:4)
我遇到了同样的问题,但我正在使用泛型。我已经使用组合框的绑定上下文来摆脱这个。 (当你不知道绑定列表的大小时非常有用 - 在你的情况下它是5个项目)
在下面的代码中,DisplayBindItem只是一个具有Key和Value的类。
List<DisplayBindItem> cust = (from x in _db.m01_customers
where x.m01_customer_type == CustomerType.Member.GetHashCode()
select new DisplayBindItem
{
Key = x.m01_id.ToString(),
Value = x.m01_customer_name
}).ToList();
cmbApprover1.BindingContext = new BindingContext();
cmbApprover1.DataSource = cust;
cmbApprover1.DisplayMember = "Value";
cmbApprover1.ValueMember = "Key";
//This does the trick :)
cmbApprover2.BindingContext = new BindingContext();
cmbApprover2.DataSource = cust ;
cmbApprover2.DisplayMember = "Value";
cmbApprover2.ValueMember = "Key";
您可以参考的课程。
public class DisplayBindItem
{
private string key = string.Empty;
public string Key
{
get { return key; }
set { key = value; }
}
private string value = string.Empty;
public string Value
{
get { return this.value; }
set { this.value = value; }
}
public DisplayBindItem(string k, string val)
{
this.key = k;
this.value = val;
}
public DisplayBindItem()
{ }
}
如果这可以解决您的问题,请标记为答案。