2009-07-01 18 views
5

¿Es posible convertir una lista IEnumerable en una colección BindingList?¿Por qué no puedo lanzar una lista de IEnumerable <T> a una lista de vinculación <t>?

La lista IEnumerable es una lista de objetos con tipo, por ejemplo:

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

Y mi PagingList simplemente extiende BindingList:

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

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

Sólo quería pasar mi lista IEnumerable a un método que hace salir la lista con mi PagingControl:

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

Pero parece que no puedo convertir el dos, ¿alguien puede señalar lo que me estoy perdiendo ?!

Muchas gracias

Ben

+1

Recuerde, un elenco a menudo es simplemente un _check_ para ver si el objeto al que se refiere realmente es del tipo que dice que es. En este caso, no es un intento de transformar de algún modo a un objeto diferente en una forma que ya no tiene. Si eso no está claro, este artículo podría ayudar: http://blogs.msdn.com/ericlippert/archive/2009/03/19/representation-and-identity.aspx –

Respuesta

4

BindingList<T> implementa IEnumerable<T>, pero no todos están listas IEnumerable<T> vinculantes (de hecho, la mayoría no lo son).

Usted debe ser capaz de crear un nuevo BindingList y añadir los elementos de la instancia enumerable.

1

se pasa PagingList en sus RenderListingsRows, que no implementa IEnumerable.

En general, para PagingList para ser una extensión más de BindingList se tiene que implementar todas las interfaces que implementa BindingList. Pero actualmente no implementa ninguno de ellos.

Debe descencer PagingList de BindingList, o poner en práctica todas estas interfaces, incluso si simplemente llamando a métodos de objeto de colección.

O bien, puede simplemente escribir para (elemento var en list.Collection)

0

Si la recolección de sus cuentas implementa IList <AccountInfo> usted debería ser capaz de hacer esto:

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

Enviar el lista de enlace a RenderListingsRows, no a la lista de paginación. PagingList no extiende BindingList sino que usa composision. De ahí el problema.

Ejemplo a continuación.

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

Sólo para señalar, a su PagingList no se extiende BindingList, se utiliza a través de la composición.

me encontré con esta buscando una respuesta similar. Ninguna de las respuestas aquí parece proporcionar una solución clara a su pregunta, aunque mencionaron puntos valiosos para resolverlo. Pensé que agregaría uno para quien pasara.

Así que dada la información proporcionada, la respuesta simple es no, pero una solución simple para lo que necesita sin Refactorizando las clases es la siguiente:

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

Por lo que usted tiene que agregar físicamente a sus artículos de Cuenta su propiedad de instancia BindingList 'Colección'.

+1

La ligera variación funcionó para mí. Gracias – n00dles

Cuestiones relacionadas