2009-07-01 33 views
5

Có thể đưa danh sách IEnumerable vào bộ sưu tập BindingList không?Tại sao tôi không thể đưa danh sách <T> của IEnumerable vào BindingList <t>?

Danh sách IEnumerable là danh sách các đối tượng gõ ví dụ:

IEnumerable<AccountInfo> accounts = bll.GetAccounts(u.UserName, u.Password); 

Và PagingList của tôi chỉ kéo dài BindingList:

public class PagingList<T> 
{ 
    public BindingList<T> Collection { get; set; } 
    public int Count { get; set; } 

    public PagingList() 
    { 
     Collection = new BindingList<T>(); 
     Count = 0; 
    } 
} 

Tôi chỉ muốn vượt qua danh sách IEnumerable tôi đến một phương pháp mà ám ra danh sách với PagingControl của tôi:

protected void RenderListingsRows(PagingList<AccountInfo> list) 
    { 
    foreach (var item in list) 
    { 
     //render stuff 
    } 
    } 

Nhưng có vẻ như tôi không thể truyền giữa hai, bất cứ ai có thể chỉ ra những gì tôi đang mất?

Rất cám ơn

Bến

+1

Hãy nhớ rằng, một diễn viên thường chỉ là một _check_ để xem nếu đối tượng bạn đang đề cập đến thực sự là loại bạn đang nói nó được. Trong trường hợp này, nó không phải là một nỗ lực bằng cách nào đó biến đổi một đối tượng khác thành một hình dạng nào đó mà nó chưa có. Nếu điều đó không rõ ràng, bài viết này có thể trợ giúp: http://blogs.msdn.com/ericlippert/archive/2009/03/19/representation-and-identity.aspx –

Trả lời

4

BindingList<T> thực hiện IEnumerable<T>, nhưng không phải tất cả IEnumerable<T> được ràng buộc danh sách (trong thực tế, hầu hết là không).

Bạn sẽ có thể tạo một BindingList mới và thêm các mục trong thể hiện được liệt kê.

1

Bạn chuyển PagingList vào RenderListingsRows của bạn, không thực hiện IEnumerable.

Nói chung, đối với PagingList là một phần mở rộng trên BindingList, nó phải triển khai tất cả các giao diện mà BindingList thực hiện. Nhưng hiện tại nó không thực hiện bất kỳ của họ.

Bạn nên kế thừa PagingList từ BindingList hoặc triển khai tất cả các giao diện này, ngay cả khi đơn giản bằng cách gọi các phương thức của đối tượng Bộ sưu tập.

Hoặc, bạn có thể chỉ đơn giản là viết for (var item trong list.Collection)

0

Nếu bộ sưu tập các tài khoản của bạn thực hiện IList <AccountInfo> bạn sẽ có thể để làm điều này:

PagedList<AccountInfo> paged = new PagedList<AccountInfo>(); 
paged.Collection = new BindingList<AccountInfo>((IList<AccountInfo>)accounts); 
0

Gửi danh sách liên kết với RenderListingsRows không phải danh sách phân trang. PagingList không mở rộng BindingList nó sử dụng tổng hợp thay thế. Do đó vấn đề.

Ví dụ bên dưới.

public class PagingList<T> 
     { 
      public BindingList<T> Collection { get; set; } 
      public int Count { get; set; } 

      public PagingList() 
      { 
       Collection = new BindingList<T>(); 
       Count = 0; 
      } 

     } 

     public void CallRenderListingsRows() 
     { 
      var pagingList = new PagingList<PostcodeDetail>(); 

      RenderListingsRows(pagingList.Collection); 
     } 

     protected void RenderListingsRows(BindingList<PostcodeDetail> list) 
     { 
      foreach (var item in list) 
      { 
       //render stuff 
      } 
     } 
1

Để chỉ ra, PagingList của bạn không mở rộng BindingList, nó sử dụng nó thông qua bố cục.

Tôi đã xem xét điều này để tìm câu trả lời tương tự. Không có câu trả lời nào ở đây dường như cung cấp giải pháp rõ ràng cho câu hỏi của bạn, mặc dù họ đã đề cập đến những điểm có giá trị trong việc tìm ra câu trả lời. Tôi nghĩ tôi sẽ thêm một cái cho bất kỳ ai đi qua.

Vì vậy, cho các thông tin được cung cấp, câu trả lời đơn giản là không, nhưng một giải pháp đơn giản để những gì bạn cần mà không refactoring lớp học của bạn là thế này:

IEnumerable<AccountInfo> accounts= bll.GetAccounts(u.UserName, u.Password); 
myPagingList.Collection = new BindingList<Foo>(myfoos.ToList()); 

Vì vậy, bạn sẽ có thể chất thêm các mục AccountInfo của bạn để thuộc tính cá thể BindingList của bạn 'Bộ sưu tập'.

+1

Biến thể nhẹ làm việc cho tôi. Cảm ơn – n00dles

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