Datengitter:Berechnen Sie den Durchschnitt oder die Summe für die Spalte in der Fußzeile

StackOverflow https://stackoverflow.com/questions/9409

Frage

Ich habe ein Datagrid, das an einen Datensatz gebunden wird, und ich möchte das durchschnittliche Ergebnis in der Fußzeile für eine mit Ganzzahlen gefüllte Spalte anzeigen.

Meiner Meinung nach fallen mir zwei Möglichkeiten ein:

1. „Verwenden Sie die Quelle, Lukas“
Verwenden Sie in dem Code, in dem ich DataGrid.DataBind() aufrufe, die Methode DataTable.Compute() (oder in meinem Fall DataSet.DataTable(0).Compute()).Zum Beispiel:

Dim strAverage = DataTable.Compute("Avg(ColumnName)", "")  

Aber wenn ich das habe, wie kann ich es dann in die Fußzeile einfügen?

2."Gebunden Für den Ruhm"
Verwenden des DataGrid.ItemDataBound-Ereignisses und Berechnen einer laufenden Summe aus jedem ListItemType.Item und ListItemType.AlternatingItem, die schließlich in ListItemType.Footer angezeigt wird.Zum Beispiel:

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

Das fühlt sich einfach falsch an, außerdem müsste ich sicherstellen, dass das RunningTotal bei jedem DataBind zurückgesetzt wird.

Gibt es einen besseren Weg?

War es hilfreich?

Lösung

Ich weiß nicht, ob beide unbedingt besser sind, aber zwei wechseln Möglichkeiten wären:

  1. Gehen Sie die Tabelle manuell durch, sobald Sie auf die Fußzeile klicken, und berechnen Sie anhand des Bildschirmtexts
  2. Rufen Sie die Daten manuell ab und führen Sie die Berechnung getrennt von der Bindung durch

Natürlich macht Nummer 2 die Vorteile der Datenbindung zunichte (vorausgesetzt, Sie tun dies).

Andere Tipps

Danke Danny Schlumpf, deine erste Antwort hat mir Sinn gegeben.(Warum suchen wir immer nach dieser magischen Lösung?).

Als Referenz hier ist, was ich letztendlich gemacht habe:(Warnung:VB unten enthält möglicherweise nicht genügend Semikolons)

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

Ich musste es für mehrere Spalten tun (daher 3 bis 8), weshalb ich letztendlich nach der magischen Lösung suchte.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top