.NET TIPS

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

山田 祥寛
2010/03/11

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

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

グリッド表のフッタ行に単価の平均値を表示

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

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

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

プロパティ 設定値
AllowPaging False
ShowFooter True
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プロパティの戻り値は、以下のとおり。

概要
DataRow データ行
Footer フッタ行
Header ヘッダ行
EmptyDataRow 空行(データが存在しない場合)
Pager ページャ
Separator 区切り行
RowTypeプロパティの戻り値(DataControlRowType列挙体のメンバ)

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

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

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

利用可能バージョン:.NET Framework 2.0
利用可能バージョン:.NET Framework 3.0
利用可能バージョン:.NET Framework 3.5
カテゴリ:Webフォーム 処理対象:GridViewコントロール
使用ライブラリ:GridViewコントロール
関連TIPS:[ASP.NET]GridViewコントロールでデータソースの内容を表示するには?

この記事と関連性の高い別の.NET TIPS
[ASP.NET]DataGridコントロールのフッターに合計行を表示するには?
[ASP.NET]DataGridコントロールですべての行にアクセスするには?
[ASP.NET]GridViewコントロールのヘッダにソート方向を表示するには?
[ASP.NET]GridViewコントロールにコマンド・ボタンを配置するには?(応用編)
[ASP.NET]GridViewコントロールでマウス・ホバー行を強調表示するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

注目のテーマ

Insider.NET 記事ランキング

本日 月間
ソリューションFLASH