2012-06-29 7 views

Respuesta

12

Lígalos cada uno para una instancia independiente de la DataSet1.Table [0].

es decir)

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

Thankyou GrandMaster. Resuelto – Alegro

+0

Me alegro de poder ayudar. – GrandMasterFlush

+1

Dependiendo de la cantidad de ComboBoxes y la cantidad de datos en su DataTable, esto podría generar un gran aumento en la huella de memoria de su aplicación debido a la duplicación de los datos. – cadrell0

6

Un mejor enfoque sería el uso de un DataView para evitar la duplicación de los datos. Además, no lances varias veces si se puede evitar.

foreach (Control c in this.Controls) 
{ 
    ComboBox comboBox = c as ComboBox; 

    if (comboBox != null) 
    {   
     comboBox.DataSource = new DataView(DataSet1.Tables[0]); 
     comboBox.DisplayMember = "Articles"; 
    } 
} 

Editar

me he dado cuenta de que puede hacer esto incluso más limpio con LINQ

foreach (ComboBox comboBox in this.Controls.OfType<ComboBox>()) 
{ 
    comboBox.DataSource = new DataView(DataSet1.Tables[0]); 
    comboBox.DisplayMember = "Articles"; 
} 
+0

Ésta es una forma mucho mejor para hacer esto. La respuesta aceptada tendría una huella de memoria mucho más grande. – SQLMason

1

me enfrenté al mismo problema, pero yo estaba trabajando con los genéricos. He usado el contexto vinculante del cuadro combinado para deshacerme de esto. (Muy útil cuando no se conoce el tamaño de la lista de enlaces, en su caso son 5 elementos)

En el siguiente código, DisplayBindItem es solo una clase con clave y valor.

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

La referencia de la clase para usted.

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

Por favor, marque como respuesta si esto resuelve su problema.

Cuestiones relacionadas