2009-03-09 33 views
6

Tôi có một GridView ASP.net mà tôi đang cố gắng liên kết với. DataSource của tôi có một bộ sưu tập và 2 trong số các cột mà tôi ràng buộc là một phần của một lớp con. DataSource của tôi có một phân lớp được gọi là Nhân viên chứa thông tin nhân viên. Các boundfields SurveyID và NumberOfExceptions ràng buộc tốt, nhưng Staff.Name và Staff.Office không thể bị ràng buộc.
Làm thế nào để bạn liên kết một cột GridView với một giá trị lớp con?

asp:BoundField DataField="SurveyID" HeaderText="ID" ... 
asp:BoundField DataField="Staff.Name" HeaderText="Name" ... 
asp:BoundField DataField="Staff.Office" HeaderText="Office" ... 
asp:BoundField DataField="NumberOfExceptions" HeaderText="Exceptions" ... 

Và mã đằng sau là:

uxSurveyGrid.DataSource = searchResults; 
uxSurveyGrid.DataBind(); 

Nếu tôi gõ searchResults[0].Staff.Name trong mã đằng sau tôi có thể nhìn thấy giá trị, tại sao thời gian chạy không thể đánh giá Staff.Name trong GridView ?

Làm cách nào để bạn liên kết các cột với các giá trị lớp con? Tôi có phải làm điều đó trong codebehind không?

Bất kỳ trợ giúp nào sẽ được đánh giá cao,

Đánh dấu.

+0

Có phải "Nhân viên" có bộ thu thập thông tin/setter cho nó không? Lớp nhân viên có getter/setters được định nghĩa cho cả hai "Name" và "Office". Một trong những điều kiện cho DataBinder.Eval (mà tôi khá chắc chắn là những gì BoundField sử dụng để truy cập dữ liệu) là getter/setters được định nghĩa cho giá trị cố gắng để được lấy ra. –

Trả lời

8

Tôi tin rằng bạn có thể có được điều này để làm việc sử dụng một cánh đồng mẫu và đánh dấu scriptlet ...

<asp:TemplateField> 
     <ItemTemplate> 
      <asp:Label Id="lblSubclassVal" runat="server" Text="<%# DataBinder.Eval(Container.DataItem, "SubClass.PropertyName")%>"></asp:Label> 
     </ItemTemplate> 
    </asp:TemplateField> 
+0

Tôi biết đã lâu rồi kể từ khi điều này được trả lời, nhưng trong trường hợp bạn nhận được thông báo - bạn có biết liệu có cách nào để làm điều tương tự không, nhưng là một Bind 2 chiều, thay vì chỉ là một đánh giá? Cảm ơn! – Brett

0

Mark,

Tôi 99,9% chắc chắn rằng bạn sẽ phải xử lý này trong codebehind trên các sự kiện ItemDataBound cho hàng cá nhân.

Hãy nhớ rằng bạn có thể nhận được toàn bộ đối tượng databould từ e.Item.DataItem

6

Các dữ liệu cơ chế ràng buộc đằng sau ASP.NET GridView chỉ hỗ trợ một mức ràng buộc. (trái với đối tác ràng buộc WinForms của nó hỗ trợ đa cấp trong trường hợp ràng buộc với một DataSet/DataTable/DataView).

Bạn có ba giải pháp khả thi:

  1. Xử lý sự kiện ItemDataBound cho mỗi hàng
  2. Mở rộng các đơn vị cấp cơ của bạn với tài sản mà phơi bày các thuộc tính đối tượng trẻ em và sử dụng các thuộc tính cho biểu thức ràng buộc
  3. Thay vì sử dụng một BoundField bạn có thể sử dụng một trường mẫu và tạo ra nội dung bằng cách sử dụng biểu thức <% =%> truy cập vào mục dữ liệu.
0

Cú pháp [Tên]. [Tên] không được BoundField hỗ trợ. Chỉ có tên thuộc tính đơn giản.

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