2012-02-14 38 views
6

Tôi đang làm việc trên một dự án Web Forms tải kết quả truy vấn Sql vào DataTable s.Binding động để tùy chỉnh đối tượng kinh doanh tại thời gian chạy

Những DataTable s này được chuyển lên đầu phía trước, nơi chúng tôi liên kết chúng với điều khiển trang web Repeater.

Công trình này tuyệt vời. Tuy nhiên, bây giờ chúng tôi muốn liên kết với các lớp tùy chỉnh của riêng chúng tôi thay vì một số DataTable. Thật không may, những gì tôi nghĩ là câu trả lời rõ ràng đã không hoạt động (thực hiện IDictionary<string, object> trên lớp của chúng tôi).

Chúng ta cần gì để có Eval gắn kết với Datum mà không tạo thuộc tính cụ thể cho mọi ràng buộc? Rõ ràng DataRow không phải thực hiện cụ thể mọi thuộc tính mà chúng ta ràng buộc. Vì vậy, bằng cách nào đó có vẻ như là Eval có thể tra cứu các giá trị thuộc tính theo tên trên DataRow.

Đây là lớp tùy chỉnh

public class Datum: IDictionary<string, object> 
{ 
    private Dictionary<string, object> _entries; 

    public Datum() 
    { 
     _entries = new Dictionary<string, object>(); 
    } 

    public object this[string s] 
    { 
     get 
     { 
      return this._entries[s]; 
     } 
    } 

    ... 
} 

Đây là nơi DataSource được thiết lập trong aspx.cs nộp

rptTags.DataSource = new[] { new Datum { {"Count", 1} }, new Datum { {"Count", 2 } }; 

Và đây là các ràng buộc trong file aspx

<asp:Repeater ID="rptTags" runat="server"> 
    <ItemTemplate> 
     <%# (int)Eval("Count") > 
    </ItemTemplate> 
</asp:Repeater> 

Sử dụng ví dụ trên, chúng tôi nhận được thông báo lỗi rằng thuộc tính được đề cập không tồn tại, điều này đúng, nhưng d cũng không tồn tại trên DataRow. Làm thế nào tôi có thể làm cho nó liên kết như System.Data.DataRow?

+0

bạn có thể chia sẻ bạn lớp mô hình dữ liệu và biểu thức eval, mà có thể giúp bạn dễ dàng hơn. –

+0

"Điều này làm cho nó là một cơn ác mộng để thử và kiểm tra bất cứ điều gì." Ví dụ? –

+0

@mark Ok Tôi nghĩ mình nhận được ... – Aristos

Trả lời

1

Tôi đã đến sáng nay với đôi mắt mới mẻ và dành vài giờ để xem qua .Net Framework với ILSpy. Cuối cùng tôi đã có thể tìm ra câu đố này và thực hiện một giải pháp làm việc. Tôi sẽ liệt kê những điều tôi đã học được phù hợp với giải pháp và sau đó chi tiết việc triển khai của tôi.

  • Khi bạn liên kết một DataTable với một bộ lặp lại mỗi RepeaterItem không liên kết với một DataRow, như tôi mong đợi, nhưng với một DataRowView. Điều này thực sự không quan trọng, ngoại trừ việc DataRowView triển khai giao diện ICustomTypeDescriptor là những gì chúng ta cần thực hiện trên lớp của chúng tôi.
  • Mặc dù MSDN documentation cho biết phương pháp Eval sử dụng sự phản chiếu để thực hiện kết thúc muộn và biểu thức của bạn phải đánh giá một thuộc tính công khai, điều này đơn giản là không đúng sự thật. Câu lệnh Eval sử dụng phương thức GetProperties() trên ICustomTypeDescriptor để đánh giá biểu thức của bạn.

Lưu ý rằng đây là các bước tôi phải thực hiện để tạo loại tùy chỉnh của riêng mình mà tôi có thể liên kết động với giống như DataTable.

  1. Tạo lớp tùy chỉnh của riêng bạn kế thừa từ PropertyDescriptor.
  2. Triển khai tất cả thành viên trừu tượng của PropertyDescriptor. Đối với ràng buộc động, điều quan trọng nhất là GetValue(). Đây là nơi bạn xác định cách lấy các giá trị từ lớp bạn đang ràng buộc.
  3. Trên lớp bạn sẽ ràng buộc, kế thừa từ CustomTypeDescriptor. Đây là một lớp chung mà triển khai ICustomTypeDescriptor.
  4. Ghi đè phương thức GetProperties() của CustomTypeDescriptor và trả về danh sách các PropertyDescriptors (được tạo ở bước 1-2) cho mỗi giá trị bạn muốn có thể liên kết.
  5. Đảm bảo rằng PropertyDescriptions của bạn có thuộc tính Tên được đặt. Đây là thuộc tính .Net so sánh biểu thức Eval của bạn để xác định PropertyDescription nào sử dụng khi liên kết.
  6. Đặt đối tượng CustomTypeDescriptor của bạn (được tạo ra trong bước 3-5) là DataSource của một WebControl và sử dụng Eval() để ràng buộc vào nó tự động
0

Nguồn dữ liệu có thể ràng buộc sẽ triển khai IEnumerable hoặc IListSource.

Về khía cạnh động: hãy nhớ rằng một phần của ma thuật của việc kết xuất dữ liệu xảy ra khi sử dụng sự phản chiếu.

+0

Cảm ơn câu trả lời. Có, tôi đã đọc trong tài liệu MSDN rằng nó sử dụng sự phản ánh để làm muộn ràng buộc. Tuy nhiên, DataRow vẫn có thể thoát khỏi với databinding động bằng cách nào đó, vì vậy tôi cảm thấy như tôi sẽ có thể là tốt. –

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