Foros del Web » Programación para mayores de 30 ;) » .NET »

ASP.Net: Enlazar datagrid a objeto Collection

Estas en el tema de ASP.Net: Enlazar datagrid a objeto Collection en el foro de .NET en Foros del Web. ¿Cómo se puede enlazar un datagrid a una colección de objetos propios? Si es posible, ¿qué instrucción hay que añadir en el html del datagrid ...
  #1 (permalink)  
Antiguo 03/12/2004, 03:23
 
Fecha de Ingreso: julio-2003
Mensajes: 120
Antigüedad: 20 años, 8 meses
Puntos: 0
ASP.Net: Enlazar datagrid a objeto Collection

¿Cómo se puede enlazar un datagrid a una colección de objetos propios?
Si es posible, ¿qué instrucción hay que añadir en el html del datagrid para hacer referencia a un item de la colección?
  #2 (permalink)  
Antiguo 12/12/2004, 15:38
 
Fecha de Ingreso: julio-2003
Mensajes: 120
Antigüedad: 20 años, 8 meses
Puntos: 0
A la vista del éxito de mi pregunta no sé si a alguien le puede interesar la solución a mi duda, pero por si algún programador tiene que cargar con la cruz de hacer esto (una cruz cargada en mi caso, como casi siempre, por el más pesado de los castigadores que todo programador debe soportar: su puto analista) ahí va la solución que he encontrado.
Por cierto, esto está sacado de esta web: http://aspalliance.com/articleViewer.aspx?aId=77&pId=-1
...donde se explica todo de forma más profesional y se puede descargar el código fuente, aunque está en c sharp.
En principio, hacer el enlace no puede ser más sencillo. Supongamos que tenemos un objeto "colección" que se llama MiColeccion que hereda de CollectionBase. Supongamos que está lleno de objetos propios que se llaman, para desperdiciar imaginación, MiClase (si a alguien le interesara le podría pasar el código completo, pero ya he dicho dudo que nadie esté interesado). Supongamos también que tenemos un datagrid que se llama MiDataGrid y que mi proyecto se llama, en el sumun de la originalidad, MiProyecto.
Pues bien, enlazar la colección es algo tan sencillo como escribir en algún punto apropiado del código de servidor esto:
MiDataGrid.DataSource = MiColeccion;
MiDataGrid.DataBind();

Ahora bien, el problema venía cuando se quería entrar en el formato de las columnas; ocultar unas, omitir otras, dar una anchura determinada, formatear fechas, etc., etc...
Lo primero, obvio, poner la propiedad AutoGenerateColumns del grid a false.
Lo que NO HAY que hacer: definir las columnas como "<asp:BoundColumn>". Por lo menos yo no he conseguiro hacer que funcione nada de esta forma.
Las columnas hay que definirlas como "<ItemTemplate>", y la forma más sencilla de mostrar uno o más datos es usar etiquetas "<asp:Label>".
Y lo más importante: las del datagrid, al generarse, reciben los items como objetos .Net brutos, o sea, tipos "Object", uno por cada item de la colección, y hay que convertirlos al tipo apropiado antes de asignarles alguna de sus propiedades. Este es el punto más chungo porque no valen las típicas de enlazar un DataTable a un data grid.
Resumiendo, la cosa quedaría más o menos así:

<Columns>
<asp:TemplateColumn HeaderText="Campo1 Cabecera" ItemStyle-Width="100%">
<ItemTemplate>
<asp:Label runat="server" Text='<%# CType(Container.DataItem, MiProyecto.MiClase).Campo1 %>' ID="Label1"></asp:Label>
</ItemTemplate>
</asp:TemplateColumn>
</Columns>

Ya he dicho que Container.DataItem recibe un elemento de la colección por cada fila. Es necesario convertirlo a la clase apropiada y entonces llamar al campo que queramos. Pero ojo, en la conversión hay que indicar completa la jerarquía de nuestra clase, con todos los "NameSpaces". Es decir, a mí no me funcionaba esto:
<%# CType(Container.DataItem, MiClase).Campo1 %>
El compilador no encontraba MiClase, aunque era pública, pq por defecto pertenece al mismo espacio de nombres que la propia aplicación. Si no ponía: <%# CType(Container.DataItem, MiProyecto.MiClase).Campo1 %> no funcionaba.
Espero q esto, algún día, le sirva a alguien.
Salud.
  #3 (permalink)  
Antiguo 14/12/2004, 02:57
 
Fecha de Ingreso: diciembre-2001
Mensajes: 150
Antigüedad: 22 años, 4 meses
Puntos: 1
Gracias

Como decía, gracias por ayudarnos a no cargar con esa pesada cruz y facilitarnos el trabajo a los demás.

De acuerdo completamente con tu apreciación sobre algunos analistas

Un saludo
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:55.