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

HELP - DataList con número de columnas variable

Estas en el tema de HELP - DataList con número de columnas variable en el foro de .NET en Foros del Web. Estoy trabajando en una página de informes estadísticos que recoja impactos de diversas fuentes, mostrando un resultado parecido a esto: FECHA 1 Impactos fuente 1 ...
  #1 (permalink)  
Antiguo 27/11/2007, 03:41
 
Fecha de Ingreso: diciembre-2003
Mensajes: 3
Antigüedad: 20 años, 5 meses
Puntos: 0
HELP - DataList con número de columnas variable

Estoy trabajando en una página de informes estadísticos que recoja impactos de diversas fuentes, mostrando un resultado parecido a esto:

FECHA 1 Impactos fuente 1 Impactos fuente 2 ... Impactos fuente n
FECHA 2 Impactos fuente 1 Impactos fuente 2 ... Impactos fuente n
...
FECHA N Impactos fuente 1 Impactos fuente 2 ... Impactos fuente n

El origen de los datos es un DataSet, el cual relleno manualmente (las fuentes pueden proveer de distintas bases de datos, lo que me obliga a realizar las consultas separadamente, "unirlas" mediante relaciones, y crear el DataSet a mano después. Esta primera parte está más que superada

El problema viene a la hora de mostrar los datos. De antemano, sólo sé que dispongo de una columna FECHA y una columna IMPACTOS1 (correspondiente a la primera fuente); a partir de aquí, puedo encontrarme con una columna IMPACTOS2, IMPACTOS3, ... (y así hasta que no hayan más columnas)

En el Header Template he conseguido insertar las columnas necesarias al DataList de la siguiente manera:

<% For Each Servicio In MyDtsListaServicios.Tables("ListaServicios").Rows% >
<td width=100px align=left><%Response.Write(Servicio("IdEstadistic a").ToString())%></td>
<% Next%>

MyDtsListaServicios es un SQLDataSource que tiene tantos registros como columnas estadísticas tendrá el DataList, y la información que saco de aquí es un identificativo para mostrar en la cabecera de las columnas

El problema viene a la hora de mostrar los datos, ya que debo recurrir al DataBinder.Eval (o al Eval a secas)

<% NumServicio=1%>
<% For Each Servicio In MyDtsListaServicios.Tables("ListaServicios").Rows% >
<td width=100px align=left><%#Eval("Impactos" & NumServicio)%></td>
<% NumServicio=NumServicio+1%>
<% Next%>

Esto, que en principio debería funcionar, fracasa estrepitosamente. NumServicio es una variable global que he declarado en la zona del código, pero mientras que el NumServicio que se incrementa lo hace a nivel de cliente, el NumServicio que se usa en el Eval está a nivel de servidor, por lo que siempre estoy consultando la columna "Impactos0" (la cual, evidentemente, no existe)

¿Alguna sugerencia para solucionar este embrollo?
  #2 (permalink)  
Antiguo 28/11/2007, 11:15
 
Fecha de Ingreso: diciembre-2003
Mensajes: 3
Antigüedad: 20 años, 5 meses
Puntos: 0
Re: HELP - DataList con número de columnas variable

Bueno... Al final buscando por internet encontré una solución que me ha resultado la mar de útil. Os la pongo aquí

El problema, como ya he comentado antes, viene de cómo definir la plantilla en un DataList, cuando los datos me vienen de un DataSet con número de columnas variable. Los únicos datos fijos se llaman FECHA y DIASEMANA, y seguidamente, una serie de campos llamados IMPACTOS1, IMPACTOS2, ..., IMPACTOSn

Este es el ItemTemplate del DataList. Aquí sólo defino dos columnas, mientras que el resto se generarán en tiempo de ejecución mediante la función GeneraColumnasImpactos

<ItemTemplate>
<tr>
<td align=left><%#Left(Eval("Fecha"),10)%></td>
<td align=left><%#DiaSemanaSQL(Eval("DiaSemana"))%></td>
<%#GeneraColumnasImpactos(Container.DataItem, Servicio)%>
</tr>
</ItemTemplate>

Y esta es la famosa función

Protected Function GeneraColumnasImpactos(ByVal DataItem As Object, ByVal Valor As DataRow) As String
Dim d As DataList

d = CType(Page.FindControl("DataList1"), DataList)
d.Width = 165
GeneraColumnasImpactos = ""
For Each Servicio In MyDtsListaServicios.Tables("ListaServicios").Rows
d.Width = d.Width.Value + 110
If IsDBNull(DataBinder.Eval(DataItem, "Impactos" & Servicio("NumServicio"))) Then
GeneraColumnasImpactos = GeneraColumnasImpactos & "<td align=right>0&nbsp;</td>"
Else
GeneraColumnasImpactos = GeneraColumnasImpactos & "<td align=right>" & DataBinder.Eval(DataItem, "Impactos" & Servicio("NumServicio")) & "&nbsp;</td>"
End If
Next
End Function

Básicamente, lo que hace esta función es recorrerse la tabla ListaServicios, que es un DataSet donde tengo un listado de las diferentes columnas de impactos. El número de estas columnas está guardado en la columna NumServicio. La solución es tan simple como ir recorriendo todas las filas de la tabla (con lo que obtendré el identificador de la columna), y generar a pelo las columnas del DataList con el campo "Impactos(id de la columna)". Al finalizar la función, el valor a devolver será una cadena con la definición de estas columnas y su contenido

La comprobación de si el valor es nulo o no no es necesaria; yo la puse para mostrar un valor 0 en caso de que el valor fuera nulo. También veréis que aprovecho para manipular la anchura del DataList; esto también es optativo

En fin, espero que esto pueda servir de ayuda a aquellos que se hayan encontrado con mi mismo problema
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 10:04.