.NET TIPS [ASP.NET]DataGridコントロールですべての行にアクセスするには?デジタルアドバンテージ2003/10/10 |
|
|
DataGridコントロールを使用する場合、データ連結を行って一覧表示を作成した後に各セルの内容やプロパティを修正したい場合がある。
「TIPS:[ASP.NET]DataGridコントロールの各セルにアクセスするには?」では、DataGridコントロールを構成するオブジェクトについて解説し、データ連結後にDataGridオブジェクトのプロパティをたどって各セルにアクセスする方法を解説した。この方法は簡便な方法であるが、ヘッダー行やフッター行に含まれるセルにはアクセスできない。
ここでは、データ連結中に発生するイベントを使用してグリッドの各行(各セル)にアクセスする方法について解説する。このイベントはDataGridコントロールのヘッダー行やフッター行を含めたすべての行に関して発生するため、そのイベント・ハンドラとなるメソッドを記述することにより、どの行のセルにもアクセスすることができる。また、イベントはデータ連結中に発生するため、その行に連結されるデータソースの要素にも容易にアクセスすることができる。
データ連結直後に発生するItemDataBoundイベント
DataGridコントロールに対してDataBindメソッドを呼び出してデータ連結を行った場合、グリッド内の各行が作成される過程で発生するイベントの1つがItemDataBoundイベントである。このItemDataBoundイベントは、DataGridコントロールの各行について、その行の各セルにテキストが設定された直後に発生する(グリッド内の行数の数だけ発生する)。
まずはItemDataBoundイベントに対応するイベント・ハンドラの記述方法から見ていこう。ItemDataBoundイベントに対応した処理を行うには、まずそのイベント・ハンドラとなる次のようなシグネチャを持つメソッドを定義する(C#の場合)。
void MyGrid_ItemBound(object sender, DataGridItemEventArgs e) {
……
}
第2パラメータの型であるDataGridItemEventArgsクラス(System.Web.UI.WebControls名前空間)には、パブリックなプロパティ「Item」が定義されている。このメソッドが呼び出されたときには、このItemプロパティにはDataGridItemクラス(System.Web.UI.WebControls名前空間)のオブジェクトがセットされる。このオブジェクトはデータ連結済みの「行」を示すものだ。DataGridItemオブジェクトや、それに含まれる各セルについては「TIPS:[ASP.NET]DataGridコントロールの各セルにアクセスするには?」で解説しているのでそちらを参照してほしい。
次に、いま定義したメソッドがItemDataBoundイベントの発生時に呼び出されるように、DataGridコントロールを定義している<asp:DataGrid>タグのOnItemDataBound属性で、そのメソッド名を指定する。
<asp:DataGrid id="MyGrid"
OnItemDataBound="MyGrid_ItemBound"
AutoGenerateColumns="false"
runat="server" >
……
</asp:DataGrid>
これでこのDataGridコントロールに対してDataBindメソッドを呼び出してデータ連結を行うたびに、各行についてMyGrid_ItemBoundメソッドが呼び出されるようになる。
作成される行の種類
すでに述べたように、ItemDataBoundイベントはヘッダー行やフッター行が作成されるときにも発生する。これらの行も通常の行(データソースの内容を表示している行)と同様に、その実体はDataGridItemオブジェクトである。DataGridItemクラスには、これらを区別するためのItemTypeプロパティが用意されている。
ここでは次のような内容のイベント・ハンドラを記述して、どのような種類の行が実際にデータ連結されるのかを見てみよう。
void MyGrid_ItemBound(object sender, DataGridItemEventArgs e) {
Response.Write("ItemType: " + e.Item.ItemType + "<br>");
}
次の画面は、「TIPS:[ASP.NET]DataGridコントロールで特定のカラムのみを表示するには?」で示したサンプル・プログラム(bounddg1.aspx)に、このイベント・ハンドラを追加して実行したときのものだ。
ItemDataBoundイベントの発生時にItemTypeプロパティの内容を表示するサンプル・プログラム(dgevent.aspx)の実行結果 |
この画面からも分かるように、ItemDataBoundイベントはヘッダー行やフッター行についても発生している。特にフッター行に関しては、プログラムで明示的に使用していなくても、DataGridコントロールでは暗黙的に作成され、イベントが発生する(この様子はページのトレース情報に表示されるコントロール・ツリーを見ても確認することができる。トレース情報の表示に関しては「TIPS:[ASP.NET]ページのトレース情報を出力するには?」を参照)。
実際のデータを表示している行については、奇数行か偶数行によりItemTypeプロパティの値が異なっていることに注意が必要だ。このため、データを表示しているすべての行アクセスするには、次のような条件文が必要となる。
void MyGrid_ItemBound(object sender, DataGridItemEventArgs e) {
if (e.Item.ItemType == ListItemType.Item
|| e.Item.ItemType == ListItemType.AlternatingItem) {
……
e.Item.Cells[0].Text = ……
……
}
}
なお、ItemTypeプロパティに設定される値はListItemType列挙体(System.Web.UI.WebControls名前空間)で定義されている値である。
行の作成時に発生するItemCreatedイベント
データ連結中に各行に対して発生するイベントには、ItemDataBoundイベント以外にも、各行の作成時に発生するItemCreatedイベントがある。このイベントのイベント・ハンドラを指定する場合には<asp:DataGrid>タグのOnItemCreated属性を使用する。メソッドのシグネチャはItemDataBoundイベントのものと同様だ。
ItemDataBoundイベントと同じように、このイベントを使用しても各セルのプロパティなどにアクセスできるが、データ連結前にイベントが発生するため、その時点ではまだ各セルのTextプロパティにテキストは設定されていない(ヘッダー行は除く)。また、このときにTextプロパティにテキストを設定してもその後で上書きされてしまうので注意が必要だ。
なおDataGridコントロールでページング機能を使用している場合、ページャ(ページ移動のためのリンクボタン)が表示される行については、ItemDataBoundイベントは発生しないが、このItemCreatedイベントは発生する点にも注意が必要だ。
カテゴリ:Webフォーム 処理対象:DataGridコントロール 使用ライブラリ:DataGridコントロール 使用ライブラリ:DataGridItemEventArgsクラス(System.Web.UI.WebControls名前空間) 使用ライブラリ:DataGridItemクラス(System.Web.UI.WebControls名前空間) 使用ライブラリ:ListItemType列挙体(System.Web.UI.WebControls名前空間) 関連TIPS:[ASP.NET]DataGridコントロールの各セルにアクセスするには? 関連TIPS:[ASP.NET]DataGridコントロールで特定のカラムのみを表示するには? 関連TIPS:[ASP.NET]ページのトレース情報を出力するには? |
「.NET TIPS」 |
- 第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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|