2009-07-15 32 views
33

Tôi có một bản đồ đối tượng tương tự như những gì được liệt kê bên dưới. Khi tôi cố gắng để ràng buộc các thuộc tính của NestedClass trong một GridView tôi nhận được lỗi:GridView bị ràng buộc với Thuộc tính của lớp lồng nhau

"A field or property with the name 'NestedClass.Name' was not found on the selected data source."

Các GridView là ràng buộc để một ObjectDataSource và ObjectDataSource được ràng buộc với một ví dụ đầy đủ dân cư của BoundClass.

Có cách nào xung quanh vấn đề này không?

lớp mẫu:

public class BoundClass 
{ 
    public string Name { get; set; } 
    public NestedClass NestedClass { get; set; } 
} 

public class NestedClass 
{ 
    public string Name { get; set; } 
} 
+0

Tên cột 'NestedClass.Name' không tồn tại từ dữ liệu mà nó đang lấy lại từ đó. – waqasahmed

Trả lời

52

tính Chỉ ngay một ví dụ có thể được hiển thị trong một cột BoundField.

Thay vào đó, bạn phải sử dụng DataBinder.Eval trong mục itemtemplate để truy cập thuộc tính lồng nhau thay vì gán nó vào một trường liên kết.

Ví dụ:

<asp:TemplateField> 
    <itemtemplate> 
     <p><%#DataBinder.Eval(Container.DataItem, "NestedClass.Name")%></p> 
    </itemtemplate> 
</asp:TemplateField> 

Ngoài ra, bạn có thể tạo một lớp tùy chỉnh mà thừa hưởng BoundField và ghi đè GetValue sử dụng DataBinder.Eval, như mô tả trong bài đăng blog:

http://web.archive.org/web/20120121123301/http://iridescence.no/post/FixingBoundFieldSupportforCompositeObjects.aspx

+8

máy rút tiền cho liên kết bị hỏng: http://web.archive.org/web/20120121123301/http://iridescence.no/post/FixingBoundFieldSupportforCompositeObjects.aspx – user423430

10

này tiện ích mở rộng trên các cuộc gọi BoundField DataBinder.Eval(), hỗ trợ các thuộc tính lồng nhau:

public class BetterBoundField : BoundField 
{ 
    protected override object GetValue(Control controlContainer) 
    { 
     if (DataField.Contains(".")) 
     { 
      var component = DataBinder.GetDataItem(controlContainer); 
      return DataBinder.Eval(component, DataField); 
     } 
     return base.GetValue(controlContainer); 
    } 
} 
+0

+1 cho phương thức tiện ích mở rộng – mcfea

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