为什么在一个Combo中更改SelectedItem会更改所有其他Combos?

我用这种方式填充了combobox

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中更改吗?

将它们绑定到DataSet1.Table [0]的单独实例。

即)

 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"; } } 

更好的方法是使用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.DataSource = new DataView(DataSet1.Tables[0]); comboBox.DisplayMember = "Articles"; } 

我遇到了同样的问题,但我正在使用generics。 我已经使用了combobox的绑定上下文来摆脱这个。 (当你不知道绑定列表的大小时非常有用 – 在你的情况下它是5个项目)

在下面的代码中,DisplayBindItem只是一个具有Key和Value的类。

  List 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() { } } 

如果这可以解决您的问题,请标记为答案。