2012-06-29 4 views

risposta

12

Uniscili a un'istanza separata di DataSet1.Table [0].

cioè)

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

Grazie GrandMaster. Risolto. – Alegro

+0

Contento di aver potuto aiutare. – GrandMasterFlush

+1

A seconda del numero di ComboBox e del volume dei dati nel DataTable, ciò potrebbe comportare un notevole aumento dell'impronta di memoria dell'applicazione a causa della duplicazione dei dati. – cadrell0

6

Un approccio migliore sarebbe quella di utilizzare un DataView per evitare di duplicare i dati. Inoltre, non eseguire il cast più volte se può essere evitato.

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

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

Modifica

Ho appena realizzato si può fare questo ancora più pulito con LINQ

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

Questo è un modo molto migliore per farlo. La risposta accettata avrebbe un'impronta di memoria molto più grande. – SQLMason

1

Ho affrontato lo stesso problema, ma stavo lavorando con i generici. Ho usato il contesto vincolante della casella combinata per sbarazzarsi di questo. (Molto utile quando non si conosce la dimensione della lista vincolante - nel tuo caso si tratta di 5 articoli)

Nel codice seguente, DisplayBindItem è solo una classe con Chiave e Valore.

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 classe di riferimento.

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

Contrassegnare come risposta se questo risolve il problema.

Problemi correlati