9

我以这种方式填充了组合框

foreach (Control c in this.Controls)
{
     if (c is ComboBox)
     {
         (c as ComboBox).DataSource = DataSet1.Tables[0];
         (c as ComboBox).DisplayMember = "Articles";
     }
}

但是,问题是当我在一个 Combo 中更改 SelectedItem 时 - 它在所有其他 Combo 中都发生了变化?

4

3 回答 3

15

将它们分别绑定到 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";
    }
}
于 2012-06-29T12:14:30.020 回答
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";
}
于 2012-06-29T20:33:02.010 回答
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()
    { }
}

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

于 2014-06-09T13:59:49.413 回答