2009-07-01 17 views
5

Czy można rzucić listę IEnumerable do kolekcji BindingList?Dlaczego nie mogę rzucić listy IEnumerable <T> do BindingList <t>?

Lista IEnumerable znajduje się lista wpisanych obiektów np:

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

A moja PagingList tylko rozciąga BindingList:

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

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

Chciałem tylko przekazać moje IEnumerable listy do sposobu, który renderuje lista z moim PagingControl:

Ale wydaje się, że nie mogę rzucić między dwa, czy ktokolwiek może wskazać, czego mi brakuje ?!

Dziękujemy

Ben

+1

Pamiętaj, że obsada często jest po prostu _check_, aby sprawdzić, czy obiekt, o którym mówisz, jest naprawdę typem, o którym mówisz. W tym przypadku nie jest to próba w jakiś sposób przekształcenia innego obiektu w jakiś kształt, którego jeszcze nie ma. Jeśli to nie jest jasne, ten artykuł może pomóc: http://blogs.msdn.com/ericlippert/archive/2009/03/19/representation-and-identity.aspx –

Odpowiedz

4

BindingList<T> realizuje IEnumerable<T>, ale nie wszystkie są wiążące IEnumerable<T> list (w rzeczywistości, większość z nich nie są).

Powinieneś być w stanie utworzyć nową listę powiązań i dodać elementy do przeliczalnej instancji.

1

Możesz przekazać PagingList do RenderListingsRows, który nie implementuje IEnumerable.

Ogólnie rzecz biorąc, aby PagingList był rozszerzeniem w stosunku do BindingList, musi implementować wszystkie interfejsy, które implementuje BindingList. Ale obecnie nie implementuje żadnego z nich.

Powinieneś dziedziczyć PagingList z BindingList lub implementować wszystkie te interfejsy, nawet jeśli po prostu wywołując metody obiektu Collection.

Albo można po prostu napisać dla (var item in list.Collection)

0

Jeśli zbiór kont implementuje IList <AccountInfo> powinieneś być w stanie to zrobić:

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

wysłać lista powiązań do RenderListingsRows nie z listą stronicowania. PagingList nie rozszerza listy BindingList, zamiast tego używa composision. Stąd problem.

Przykład poniżej.

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

Po prostu, aby podkreślić, twoja lista stronicowania nie rozszerza listy BindingList, używa jej przez kompozycję.

Natrafiłem na to, szukając podobnej odpowiedzi. Żadna z odpowiedzi tutaj nie wydaje się stanowić jasnego rozwiązania twojego pytania, chociaż wspomnieli oni o cennych punktach w jego zrozumieniu. Myślałem, że dodam jedną dla każdego, kto przechodzi obok.

Więc biorąc pod uwagę informacje dostarczone, prosta odpowiedź brzmi: nie, ale proste rozwiązanie, co trzeba bez refactoring swoje zajęcia to:

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

Więc trzeba fizycznie dodać przedmioty do AccountInfo własność instancji klasy BindingList "Kolekcja".

+1

Pomógł mi mały wariant. Dzięki – n00dles

Powiązane problemy