2008-08-13 19 views
5

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.Cuadrícula de datos: calcular la media o la suma de la columna en el pie de página

La forma en que figura, hay 2 maneras que se me ocurren:

1. "utilizan la Fuente, Lucas"
En el código donde estoy llamando DataGrid.DataBind(), utilice 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 calcular un total acumulado de todos los ListItemType.Item y ListItemType.AlternatingItem, finalmente, se presentan 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 valor de RunningTotal se reinicie en cada DataBind.

¿Hay una manera mejor?

Respuesta

1

No sé si alguno son necesariamente mejores, pero hay dos alternativas formas serían:

  1. ejecutar manualmente a través de la mesa una vez que se pulsa el pie de página y calcular a partir del texto en pantalla
  2. recuperar manualmente los datos y hacer el cálculo por separado de la unen

Por supuesto, # 2 tipo de compensaciones de las ventajas de enlace de datos (suponiendo que eso es lo que está haciendo).

1

Gracias DannySmurf, su 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, pueden 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 

que tenía que hacerlo por varias columnas (de ahí 3 a 8), en última instancia, por qué estaba buscando la solución mágica.

Cuestiones relacionadas