2009-03-25 26 views
13

Tôi cố gắng để DataBind một DataGridView vào một danh sách có chứa một lớp học với cấu trúc sau:Winforms DataGridView DataBind đến phức tạp loại/lồng nhau tài sản

MyClass.SubClass.Property 

Khi tôi bước qua mã, SubClass không bao giờ yêu cầu .

Tôi không gặp bất kỳ lỗi nào, chỉ không thấy bất kỳ dữ liệu nào.

Lưu ý rằng tôi có thể databind trong biểu mẫu chỉnh sửa có cùng phân cấp.

Trả lời

12

Law of Demeter.

Tạo thuộc tính trên MyClass hiển thị SubClass.Property. Giống như vậy:

public class MyClass 
{ 
    private SubClass _mySubClass; 

    public MyClass(SubClass subClass) 
    { 
     _mySubClass = subClass; 
    } 

    public PropertyType Property 
    { 
     get { return _subClass.Property;} 
    } 
} 
+1

đúng, đó là trường hợp kịch bản cuối cùng của tôi, nhưng tôi có 7 phân nhóm làm đối phó với vì vậy tôi đang tìm kiếm một cách tốt hơn. Thx cho tip mặc dù. –

+0

@BZ http://www.developer-corner.com/blog/2007/07/19/datagridview-how-to-bind-nested-objects/ –

3

Bạn không thể liên kết một DataGridView với thuộc tính lồng nhau. Nó không được cho phép.

Một giải pháp là sử dụng ObjectBindingSource làm Nguồn dữ liệu này.

4

Bạn có thể thêm trình xử lý vào sự kiện DataBindingComplete và điền vào các loại lồng nhau ở đó. Something như thế này:

trong Form_Load:

dataGridView.DataBindingComplete += new DataGridViewBindingCompleteEventHandler(dataGridView_DataBindingComplete); 

sau trong mã:

void dataGridView_DataBindingComplete(object sender, 
     DataGridViewBindingCompleteEventArgs e) 
{ 
    foreach (DataGridViewRow row in dataGridView.Rows) 
    { 
     string consumerName = null; 
     consumerName = ((Operations.Anomaly)row.DataBoundItem).Consumer.Name; 
     row.Cells["Name"].Value = consumerName; 
    } 
} 

Nó không phải là đẹp, nhưng hoạt động.

+0

Có thể nhanh hơn khi truyền tất cả các mục của bạn sang một loại phụ trước Kết nối dữ liệu. – vizmi

0

Bạn cũng có thể sử dụng LINQ!

Nhận danh sách chung của bạn và sử dụng .Chọn cho chọn các lĩnh vực như dụ dưới đây:

var list = (your generic list).Select(i => new { i.idnfe, i.ide.cnf }).ToArray(); 

if (list .Length > 0) { 
     grid1.AutoGenerateColumns = false; 
     grid1.ColumnCount = 2; 

     grid1.Columns[0].Name = "Id"; 
     grid1.Columns[0].DataPropertyName = "idnfe"; 
     grid1.Columns[1].Name = "NumNfe"; 
     grid1.Columns[1].DataPropertyName = "cnf"; 

     grid1.DataSource = lista; 
     grid1.Refresh(); 

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