Cuadrícula de datos:Calcular el promedio o la suma de la columna en el pie de página
Pregunta
Tengo una cuadrícula de datos vinculada a un conjunto de datos y quiero mostrar el resultado promedio en el pie de página de una columna llena de números enteros.
A mi modo de ver, hay 2 formas en las que puedo pensar:
1."Utilice el Fuente, Lucas "
En el código donde llamo a DataGrid.DataBind(), use el método DataTable.Compute() (o en mi caso DataSet.DataTable(0).Compute()).Por ejemplo:
Dim strAverage = DataTable.Compute("Avg(ColumnName)", "")
Pero una vez que tenga esto, ¿cómo puedo insertarlo en el pie de página?
2."Atado por Gloria"
Usando el evento DataGrid.ItemDataBound y calculando un total acumulado de cada ListItemType.Item y ListItemType.AlternatingItem, mostrándolo finalmente en ListItemType.Footer.Por ejemplo:
Select Case e.Item.ItemType
Case ListItemType.Item, ListItemType.AlternatingItem
runningTotal += CInt(e.Item.Cells(2).Text)
Case ListItemType.Footer
e.Item.Cells(2).Text = runningTotal/DataGrid.Items.Count
End Select
Esto simplemente se siente mal, además tendría que asegurarme de que el total en ejecución se restablezca en cada DataBind.
¿Existe una mejor manera?
Solución
No sé si alguno de ellos es necesariamente mejor, pero dos alterno formas serían:
- Recorra manualmente la tabla una vez que llegue al pie de página y calcule a partir del texto en pantalla
- Recupere manualmente los datos y realice el cálculo por separado del enlace
Por supuesto, el número 2 compensa las ventajas del enlace de datos (suponiendo que eso es lo que estás haciendo).
Otros consejos
Gracias DannyPitufo, tu primera respuesta me hizo ver sentido.(¿Por qué siempre buscamos esa solución mágica?).
Como referencia, esto es lo que terminé haciendo:(Advertencia:VB a continuación, puede que no contenga suficientes puntos y comas)
Case ListItemType.Footer
e.Item.Cells(0).Text = "Average"
For i As Integer = 3 To 8
Dim runningTotal As Integer = 0
For Each row As DataGridItem In DataGrid.Items
If IsNumeric(row.Cells(i).Text) Then
runningTotal += CInt(row.Cells(i).Text)
End If
Next
e.Item.Cells(i).Text = Math.Round(runningTotal / DataGrid.Items.Count, 0)
Next
End Select
Necesitaba hacerlo en varias columnas (de ahí, de 3 a 8), y finalmente por eso estaba buscando la solución mágica.