.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. イベント・ハンドラを定義する
平均値を求めるとともに、その結果をフッタ行に反映させるためのイベント・ハンドラを定義する。具体的なコードは、以下のとおりである。
|
||
書籍単価の平均値を求め、その結果をフッタに表示するイベント・ハンドラ(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) / グリッド表の行数」――つまり、書籍単価の平均値をセットしている。
以上で、一連の手順は完了である。サンプルを実行し、冒頭の画面のように、グリッド表のフッタ行に単価平均が表示されていることを確認してほしい。
TechTargetジャパン
Insider.NET フォーラム 新着記事
- 第12回 クラスの利用 (2015/7/16)
最終回はいよいよクラスの利用。クラスの基本や重要な考え方を詳しく解説する。TypeScriptでプログラミングへの理解を一歩深めよう - アプリ中断時にもダウンロードを継続するには? (2015/7/15)
Windows.Networking.BackgroundTransfer名前空間が提供するAPIを使って、アプリが中断中でもダウンロードを継続させる方法を解説する - Visual Studio Codeの使い方、基本の「キ」 (2015/7/10)
Visual Studioファミリーの新メンバーであるVisual Studio Codeの概要と操作方法の基本を見てみよう - タイムゾーンから時差を求めるには? (2015/7/8)
TimeZoneInfoクラスを利用して、Windowsが保持しているタイムゾーン情報を取得し、そこから時差を求める方法を解説する
Insider.NET 記事ランキング
本日 月間