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 ?

Était-ce utile?

La solution

Je ne sais pas si l'un ou l'autre est forcément meilleur, mais deux alterner les moyens seraient :

  1. Parcourez manuellement le tableau une fois que vous avez atteint le pied de page et calculez à partir du texte à l'écran
  2. 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top