2009-07-01 117 views
5

是否可以將IEnumerable列表轉換爲BindingList集合?爲什麼我不能將IEnumerable <T>列表投射到BindingList <t>?

了IEnumerable列表類型對象的列表,例如:

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

而我PagingList只是延伸的BindingList:

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

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

我只是想我的IEnumerable列表傳遞給呈現出來的方法與我的PagingControl清單:

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

但似乎我不能施放兩個,任何人都可以指出我錯過了什麼?!

非常感謝

+1

記住,一個強制轉換通常只是一個_check_來查看您所指的對象是否真的是您所說的類型。在這種情況下,它不是試圖以某種方式將一個不同的對象變形爲一個它尚未擁有的形狀。如果還不清楚,這篇文章可能會有所幫助:http://blogs.msdn.com/ericlippert/archive/2009/03/19/representation-and-identity.aspx – 2009-07-01 16:33:25

回答

4

BindingList<T>實現IEnumerable<T>,但不是所有的IEnumerable<T>具有約束力列表(其實大部分都不是)。

您應該能夠創建一個新的BindingList並在可枚舉實例中添加項目。

1

您將PagingList傳遞到您的RenderListingsRows,它不實現IEnumerable。

通常,對於PagingList是BindingList的擴展,它必須實現BindingList實現的所有接口。但目前它沒有實現任何一個。

您應該從BindingList繼承PagingList,或者實現所有這些接口,即使只是通過調用Collection對象的方法。

或者,你可以只是簡單的寫(在list.Collection VAR項目)

0

如果你的賬戶集合實現IList <AccountInfo>你應該能夠做到這一點:

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

發送綁定列表到RenderListingsRows而不是分頁列表。 PagingList不會擴展它使用composision的BindingList。因此,這個問題。

下面的示例。

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

只要指出,你的PagingList不會擴展BindingList,它通過組合使用它。

我遇到了這個尋找類似的答案。這裏沒有任何答案似乎爲你的問題提供了明確的解決方案,儘管他們提出瞭解決這個問題的寶貴觀點。我想我會爲經過的任何人添加一個。

因此,考慮所提供的信息,簡單的答案是否定的,但一個簡單的解決方案,你需要什麼不重構你的類是這樣的:

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

所以你必須給你的身體的項目AccountInfo添加你的BindingList實例屬性'Collection'。

+1

微小變化對我有效。謝謝 – n00dles 2017-08-03 03:40:12

相關問題