2008-08-13 10 views
5

Ich habe ein Datagrid, das an ein Dataset gebunden wird, und ich möchte das durchschnittliche Ergebnis in der Fußzeile für eine Spalte anzeigen, die mit Ganzzahlen gefüllt wird.Datagrid: Berechnung von Avg oder Summe für Spalte in Footer

So wie ich Figur, gibt es zwei Möglichkeiten, wie ich denken kann:

1. "Verwenden Sie die Quelle, Luke"
In dem Code, wo ich DataGrid.DataBind() bin Aufruf, verwenden Sie die DataTable.Compute() -Methode (oder in meinem Fall DataSet.DataTable (0) .Compute()). Zum Beispiel:

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

Aber sobald ich dies habe, wie kann ich es in die Fußzeile einfügen?

2. "Bound for Glory"
Mit dem DataGrid.ItemDataBound Ereignis, und Berechnen einer laufenden Summe von jedem ListItemType.Item und ListItemType.AlternatingItem schließlich in ListItemType.Footer anzuzeigen. 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, und ich müsste sicherstellen, dass das runningTotal auf jedem DataBind zurückgesetzt wird.

Gibt es einen besseren Weg?

Antwort

1

Ich weiß nicht, ob entweder unbedingt besser ist, aber zwei alternative Möglichkeiten wären:

  1. manuell durch den Tisch laufen, wenn Sie die Fußzeile und berechnen aus dem On-Screen-
  2. Text treffen
  3. manuell die Daten abrufen und aus der bind

natürlich, # 2 Art von Versetzungen der Vorteile der Datenbindung (unter der Annahme, dass das, was Sie tun) die Berechnung separat tun.

1

Dank DannySmurf, machte Ihre erste Antwort mir Sinn zu sehen. (Warum suchen wir immer nach dieser magischen Lösung?).

Als Referenz hier ist, was ich am Ende tun: (Achtung: unter VB, enthält möglicherweise nicht genug 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 es für mehrere Spalten tun musste (also 3 bis 8), Letztendlich suchte ich nach der magischen Lösung.

Verwandte Themen