[ASP.NET]GridViewコントロールのフッタ行に合計値/平均値を表示するには?[2.0、3.0、3.5、C#、VB] − @IT

 

.NET TIPS

[ASP.NET]GridViewコントロールのフッタ行に合計値/平均値を表示するには?[2.0、3.0、3.5、C#、VB]

山田 祥寛
2010/03/11

 GridViewコントロールの列に数値データが含まれる場合、この合計値や平均値をフッタ行に表示することができる。

 以下の画面は、「TIPS:[ASP.NET]GridViewコントロールでデータソースの内容を表示するには?」で作成したグリッド表を基に、データベースに登録されている書籍単価の平均値を求め、フッタ行に表示したものだ。

 目的自体は誤解のしようもなく明快であるので、さっそく具体的な手順の紹介に移ろう。なお、本稿ではグリッド表そのものの作成方法については、前掲のTIPSに譲り、グリッド表に対してフッタ行を追加する差分の手順にフォーカスする。

1. グリッド表のプロパティを設定する

 以下の表のように、GridViewコントロールのプロパティ設定を変更する。

 フッタ行を表示するには、ShowFooterプロパティをTrue(デフォルト値はFalse)に設定する必要がある。

 AllowPagingプロパティ(ページングを有効にするか)をFalseにしているのは、ページングが有効になっていると、現在のページに表示された書籍についてしか平均値を求められないためだ。本稿のようなケースでは、ページごとに平均値を求めても意味はないので、ページングは無効にしている。

2. イベント・ハンドラを定義する

 平均値を求めるとともに、その結果をフッタ行に反映させるためのイベント・ハンドラを定義する。具体的なコードは、以下のとおりである。

// 単価の合計値を格納するための変数
Single sum  = 0;

// データ・バインド時に呼び出されるイベント・ハンドラ


protected void grid_RowDataBound(Object sender, GridViewRowEventArgs e)
{
  // 現在行の種類によって処理を分岐
  switch (e.Row.RowType) {

    // (1)現在行がデータ行である場合、price列の値を加算


    case DataControlRowType.DataRow :
      var row = (DataRowView)e.Row.DataItem;
      sum += Single.Parse(row["price"].ToString());
      break;

    // (2)現在行がフッタ行である場合、


    // 合計値÷行数で平均値を求め、表示
    case DataControlRowType.Footer :
      e.Row.Cells[3].Text = "平均:" + (sum / grid.Rows.Count);
      break;
  }
}
' 単価の合計値を格納するための変数
Dim sum As Integer = 0

' データ・バインド時に呼び出されるイベント・ハンドラ


Protected Sub grid_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs)

  ' 現在行の種類によって処理を分岐


  Select e.Row.RowType

    ' (1)現在行がデータ行である場合、price列の値を加算


    Case DataControlRowType.DataRow
      Dim row = DirectCast(e.Row.DataItem, DataRowView)
      sum += row.Item("price")

    ' (2)現在行がフッタ行である場合、


    ' 合計値÷行数で平均値を求め、表示
    Case DataControlRowType.Footer
      e.Row.Cells(3).Text = "平均:" & (sum / grid.Rows.Count)
  End Select
End Sub
書籍単価の平均値を求め、その結果をフッタに表示するイベント・ハンドラ(Average.aspx。上:C#、下:VB)

 グリッド表の各行にアクセスするには、RowDataBoundイベントを利用すればよい。RowDataBoundイベントは、グリッド表の各行にデータがバインドされたタイミングで発生するイベントだ。RowDataBoundイベントを利用することで、グリッド表の各行における値にアクセスしたり、行そのものの出力をカスタマイズしたりすることが可能になる。

 RowDataBoundイベント・ハンドラでは、第2引数として渡されたGridViewRowEventArgsオブジェクト(System.Web.UI.WebControls名前空間)のRowプロパティにアクセスすることで、現在描画している行情報(GridViewRowオブジェクト)を取得できる。

 ここでは、取得したGridViewRowオブジェクトから、さらにRowTypeプロパティにアクセスして、現在行の種類を判定しているわけだ。RowDataBoundイベントは、データ行だけではなく、ヘッダ/フッタ行についても発生している点に要注目である。

 RowTypeプロパティの戻り値は、以下のとおり。

 (1)では、現在行がデータ行である場合に、DataItemプロパティ経由で基となるデータ・オブジェクト(DataRowViewオブジェクト)を取得し、そのpriceフィールドの値を変数sumに足し込んでいるわけだ。これによって、すべての行をバインドし終わったときには、全書籍の単価合計が変数sumにセットされていることになる。

 (2)は、(1)での結果を最終的にフッタ行に反映させている。現在行のセル群はGridViewRowオブジェクトのCellsプロパティでアクセスできる。ここでは、現在行の左から3番目のセルに「合計値(変数sum) / グリッド表の行数」――つまり、書籍単価の平均値をセットしている。

 以上で、一連の手順は完了である。サンプルを実行し、冒頭の画面のように、グリッド表のフッタ行に単価平均が表示されていることを確認してほしい。End of Article




TechTargetジャパン

Insider.NET フォーラム 新着記事

Insider.NET 記事ランキング

本日 月間