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

时间:2012-06-29 12:06:27

标签: c# winforms 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中都会被更改?

3 个答案:

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

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