質問

データセットにバインドされているデータグリッドがあり、整数が入力された列のフッターに平均結果を表示したいと考えています。

私の考えでは、次の 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 代わりの 方法は次のとおりです。

  1. フッターをクリックしたら表を手動で実行し、画面上のテキストから計算します。
  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) に対してこれを行う必要があり、最終的に私が魔法の解決策を探していた理由はこれです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top