Griglia dati:Calcola Avg o Somma per la colonna nel piè di pagina
Domanda
Ho una griglia di dati che viene associata a un set di dati e desidero visualizzare il risultato medio nel piè di pagina per una colonna popolata con numeri interi.
Per come la vedo io, ci sono 2 modi in cui posso pensare:
1."Utilizzare il Fonte, Luca"
Nel codice in cui chiamo DataGrid.DataBind(), utilizza il metodo DataTable.Compute() (o nel mio caso DataSet.DataTable(0).Compute()).Per esempio:
Dim strAverage = DataTable.Compute("Avg(ColumnName)", "")
Ma una volta ottenuto questo, come posso inserirlo nel footer?
2."Limite per la gloria"
Utilizzando l'evento DataGrid.ItemDataBound e calcolando un totale parziale da ogni ListItemType.Item e ListItemType.AlternatingItem, infine visualizzandolo in ListItemType.Footer.Per esempio:
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
Sembra semplicemente sbagliato, inoltre dovrei assicurarmi che runningTotal venga ripristinato su ogni DataBind.
C'è un modo migliore?
Soluzione
Non so se uno dei due sia necessariamente migliore, ma due alternato i modi sarebbero:
- Scorri manualmente la tabella una volta raggiunto il piè di pagina e calcola dal testo sullo schermo
- Recupera manualmente i dati ed esegui il calcolo separatamente dal collegamento
Naturalmente, il numero 2 compensa in qualche modo i vantaggi dell'associazione dati (supponendo che sia quello che stai facendo).
Altri suggerimenti
Grazie Danny Puffo, la tua prima risposta mi ha fatto capire.(Perché cerchiamo sempre quella soluzione magica?).
Per riferimento, ecco cosa ho finito per fare:(Avvertimento:VB di seguito potrebbe non contenere abbastanza punti e virgola)
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
Avevo bisogno di farlo per diverse colonne (quindi da 3 a 8), ecco perché cercavo la soluzione magica.