データグリッド:フッターの列の平均または合計を計算します
質問
データセットにバインドされているデータグリッドがあり、整数が入力された列のフッターに平均結果を表示したいと考えています。
私の考えでは、次の 2 つの方法が考えられます。
1.「 ソース, 、ルーク」
DataGrid.DataBind() を呼び出しているコードでは、DataTable.Compute() メソッド (または私の場合は DataSet.DataTable(0).Compute())。例えば:
Dim strAverage = DataTable.Compute("Avg(ColumnName)", "")
しかし、これを取得した後、フッターに挿入するにはどうすればよいでしょうか?
2."バウンド 栄光のために」
DataGrid.ItemDataBound イベントを使用し、すべての ListItemType.Item および ListItemType.AlternatingItem から累計を計算し、最終的に ListItemType.Footer に表示します。例えば:
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
これは間違っていると感じます。さらに、DataBind ごとに runningTotal がリセットされていることを確認する必要があります。
もっと良い方法はありますか?
解決
必ずしもどちらが良いかはわかりませんが、2 代わりの 方法は次のとおりです。
- フッターをクリックしたら表を手動で実行し、画面上のテキストから計算します。
- データを手動で取得し、バインドとは別に計算を実行します。
もちろん、#2 はデータ バインディングの利点を相殺するものです (データ バインディングがそうしていると仮定して)。
他のヒント
ありがとう ダニー・スマーフ, 、あなたの最初の答えは私に理にかなっていました。(なぜ私たちはいつもそのような魔法の解決策を探すのでしょうか?).
参考までに、私が最終的にやったことは次のとおりです。(警告:以下の VB、十分なセミコロンが含まれていない可能性があります)
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
いくつかの列 (つまり 3 ~ 8) に対してこれを行う必要があり、最終的に私が魔法の解決策を探していた理由はこれです。