Grille de données:Calculer la moyenne ou la somme pour la colonne du pied de page
Question
J'ai une grille de données liée à un ensemble de données et je souhaite afficher le résultat moyen dans le pied de page d'une colonne remplie d'entiers.
D'après moi, il y a 2 façons de penser :
1."Utilisez le Source, Luc"
Dans le code où j'appelle DataGrid.DataBind(), utilisez la méthode DataTable.Compute() (ou dans mon cas DataSet.DataTable(0).Compute()).Par exemple:
Dim strAverage = DataTable.Compute("Avg(ColumnName)", "")
Mais une fois que j’ai ceci, comment puis-je l’insérer dans le pied de page ?
2."Lié pour la gloire"
Utilisation de l'événement DataGrid.ItemDataBound et calcul d'un total cumulé à partir de chaque ListItemType.Item et ListItemType.AlternatingItem, affichage final dans ListItemType.Footer.Par exemple:
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
Cela semble tout simplement faux, et je devrais m'assurer que le runningTotal est réinitialisé à chaque DataBind.
Existe-t-il une meilleure façon ?
La solution
Je ne sais pas si l'un ou l'autre est forcément meilleur, mais deux alterner les moyens seraient :
- Parcourez manuellement le tableau une fois que vous avez atteint le pied de page et calculez à partir du texte à l'écran
- Récupérez manuellement les données et effectuez le calcul séparément de la liaison
Bien sûr, le numéro 2 compense en quelque sorte les avantages de la liaison de données (en supposant que c'est ce que vous faites).
Autres conseils
Merci DannySmurf, votre première réponse m'a fait comprendre.(Pourquoi cherchons-nous toujours cette solution magique ?).
Pour référence, voici ce que j'ai fini par faire :(Avertissement:VB ci-dessous, peut ne pas contenir suffisamment de points-virgules)
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
J'avais besoin de le faire sur plusieurs colonnes (donc 3 à 8), c'est finalement pourquoi je cherchais la solution magique.