2012-06-29 29 views

Trả lời

12

Kết nối từng người với một phiên bản riêng biệt của DataSet1.Table [0].

tức)

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. Giải quyết. – Alegro

+0

Vui vì tôi có thể giúp. – GrandMasterFlush

+1

Tùy thuộc vào số lượng ComboBox và dữ liệu trong DataTable của bạn, điều này có thể dẫn đến sự gia tăng lớn trong bộ nhớ của ứng dụng do trùng lặp dữ liệu. – cadrell0

6

Một cách tiếp cận tốt hơn sẽ được sử dụng một DataView để tránh sao chép dữ liệu. Ngoài ra, không cast nhiều lần nếu nó có thể tránh được.

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

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

Sửa

Tôi chỉ nhận ra bạn có thể làm điều này thậm chí còn sạch hơn với LINQ

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

Đây là cách tốt hơn để thực hiện việc này. Câu trả lời được chấp nhận sẽ có dung lượng bộ nhớ lớn hơn nhiều. – SQLMason

1

tôi phải đối mặt với cùng một vấn đề nhưng tôi đã làm việc với Generics. Tôi đã sử dụng bối cảnh ràng buộc của hộp kết hợp để loại bỏ điều này. (Rất hữu ích khi bạn không biết kích thước của danh sách ràng buộc - trong trường hợp của bạn là 5 mục)

Trong mã bên dưới, DisplayBindItem chỉ là một lớp có Khóa và Giá trị.

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

Lớp học để bạn tham khảo.

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

Hãy đánh dấu câu trả lời nếu cách này giải quyết được sự cố của bạn.

Các vấn đề liên quan