2012-06-29 11 views

Odpowiedz

12

Powiąż je z osobnymi instancjami DataSet1.Table [0].

tj)

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

Dziękuję GrandMaster. Rozwiązany. – Alegro

+0

Cieszę się, że mogę pomóc. – GrandMasterFlush

+1

W zależności od liczby elementów składowych i liczby danych w tabeli DataTable może to doprowadzić do znacznego wzrostu śladu pamięci aplikacji spowodowanego duplikowaniem danych. – cadrell0

6

Lepszym rozwiązaniem byłoby użyć DataView aby uniknąć powielania danych. Nie należy też rzucać wiele razy, jeśli można tego uniknąć.

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

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

Edit

Właśnie uświadomiłem sobie, można to zrobić nawet odkurzacz z LINQ

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

To jest o wiele lepszy sposób na zrobienie tego. Przyjęta odpowiedź miałaby znacznie większy ślad pamięci. – SQLMason

1

I w obliczu tego samego problemu, ale ja pracowałem z rodzajowych. Użyłem kontekstu powiązania pola kombi, aby się tego pozbyć. (Bardzo przydatne, gdy nie znasz rozmiaru listy powiązań - w Twoim przypadku jest to 5 pozycji)

W poniższym kodzie DisplayBindItem to tylko klasa z kluczem i wartością.

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

Klasę dla ciebie odniesienia.

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

Proszę oznaczyć jako odpowiedź, jeśli rozwiąże to problem.

Powiązane problemy