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?

¿Fue útil?

Solución

No sé si alguno de ellos es necesariamente mejor, pero dos alterno formas serían:

  1. Recorra manualmente la tabla una vez que llegue al pie de página y calcule a partir del texto en pantalla
  2. 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top