asp.net - pasar - Datagrid: calcula el promedio o la suma de la columna en el pie de página
imprimir datagridview vb net (2)
No sé si alguno de ellos es necesariamente mejor, pero dos formas alternativas serían:
- Manualmente ejecute la tabla una vez que golpea el pie de página y calcule desde el texto en pantalla
- Recupere manualmente los datos y haga el cálculo por separado del enlace
Por supuesto, el # 2 compensa las ventajas del enlace de datos (suponiendo que eso sea lo que estás haciendo).
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 poblada con enteros.
La forma en que me imagino, hay 2 formas en que puedo pensar:
1. "Usa la Fuente , Lucas"
En el código al que estoy llamando 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 tengo esto, ¿cómo puedo insertarlo en el pie de página?
2. " Bound for Glory"
Utilizando el evento DataGrid.ItemDataBound y calculando un total acumulado de cada ListItemType.Item y ListItemType.AlternatingItem, finalmente se muestra 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 RunningTotal se reinicie en cada DataBind.
¿Hay una mejor manera?
Gracias DannySmurf , tu primera respuesta me hizo ver el sentido. ( ¿Por qué siempre buscamos esa solución mágica? ).
Como referencia, esto es lo que terminé haciendo: ( Advertencia: VB a continuación, puede no contener 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 (por lo tanto, de 3 a 8), en última instancia, por qué estaba buscando la solución mágica.