|
.NET TIPS [ASP.NET]DataGridコントロールの行にデータを埋め込むには?デジタルアドバンテージ2003/10/31 |
![]() |
|
|
|
DataGridコントロールを使用する場合、グリッド上に表示しているデータとは別に、各行に固有のデータを持たせたい場合がある。
例えば、次に示したサンプル・プログラムは本Insider.NETフォーラムの最新記事を15本表示し、各行の先頭にある[表示]ボタンがクリックされるとその記事本文のページを表示する。データソースとなるデータテーブルには「タイトル」列と「概要」列で表示しているtitleカラムとdescriptionカラム以外に、記事のURLを含んだlinkカラムが存在するとしよう。[表示]ボタンがクリックされたときにそのページに移動できるようにするには、行ごとに異なるlinkカラムのデータをどのようにしてDataGridコントロールで持たせておくことができるだろうか。
![]() |
| [表示]ボタンがクリックされると記事ページに移動するサンプル・プログラム (datakeys.aspxおよびhiddencolumn.aspx) |
ここではグリッドの各行にデータを埋め込むための方法を2つ紹介する。
非表示の列によるデータの保持
行にデータを埋め込む1つの方法は、実行時には作成されるがHTMLとしては出力されない「非表示の列」をグリッドに含めるというものだ。列を非表示にするには、列の定義でVisible属性をfalseに設定すればよい。
上記のサンプル・プログラムでは、「概要」列の次に、linkカラムのデータに連結する非表示の列を次のようにして定義している。
<asp:DataGrid ……>
<Columns>
……
<asp:BoundColumn
DataField="description" HeaderText="概要" />
<asp:BoundColumn
Visible="false"
DataField="link" />
</Columns>
</asp:DataGrid>
この場合、[表示]ボタンがクリックされたときに呼び出されるイベント・ハンドラは次のようになる。ボタンを表示するためのボタン列やイベント・ハンドラの設定については「TIPS:[ASP.NET]DataGridコントロールの列にボタンを表示するには?」を参考にしていただきたい。
void Grid_Command(object sender, DataGridCommandEventArgs e) {
Response.Redirect(e.Item.Cells[3].Text);
}
このメソッドではe.Itemが行(DataGridItemオブジェクト)を示しており、その行の4番目のセルに文字列として埋め込まれているURLに、HttpResponseクラス(System.Web名前空間)のRedirectメソッド(HttpResponseオブジェクトはページのResponseプロパティからアクセス可能)を使用してページの移動を行っている。
プログラムの全ソース・コードは次のようになっている。
|
|
| 非表示の列を使用したC#のサンプル・プログラム(hiddencolumn.aspx) | |
データソースとして使用しているRSS情報については「TIPS:[ASP.NET]DataGridコントロールでデータセットを表示するには?」を参考にしていただきたい。
DataKeysプロパティによるデータの保持
もう1つの方法は、DataGridオブジェクトのDataKeysプロパティを使用するものだ。
DataKeysプロパティはインデックスによりその要素を取得できるコレクションであり、DataGridコントロールのDataKeyField属性で指定したデータソースのフィールド(データソースがデータテーブルの場合にはカラム)のデータを保持している。
まず、DataKeyField属性の指定は<asp:DataGrid>タグで次のようにして行う。列定義時に指定するDataField属性と同じようなものだ。
<asp:DataGrid id="MyGrid"
OnItemCommand="Grid_Command"
DataKeyField="link"
AutoGenerateColumns="false"
CellPadding="4"
runat="server" >
……
</asp:DataGrid>
この指定では、各行に対応したlinkカラムのデータが、DataGridオブジェクトのDataKeysプロパティのコレクション要素として設定される。
DataKeysプロパティでは、行のインデックス番号(DataGridItemオブジェクトのItemIndexプロパティ)により、その行に対応した値を取り出すことができるので、この場合の[表示]ボタンのイベント・ハンドラは次のように記述できる。
void Grid_Command(object sender, DataGridCommandEventArgs e) {
Response.Redirect((string)MyGrid.DataKeys[e.Item.ItemIndex]);
}
DataKeysプロパティは本来、各行のキーとなる値(グリッドの行に対応するデータソースの要素を一意に識別するための値)を保持するためのものである。データソースがデータベースから取得したデータテーブルである場合には、DataKeyField属性にそのテーブルの主キーとなるカラムを指定するのが一般的な使い方だ。
DataKeysプロパティとDataKeyField属性を使用したバージョンのサンプル・プログラムの全ソース・コードは次のようになる。
|
|
| DataKeysプロパティを使用したサンプル・プログラム(datakeys.aspx) | |
DataKeysプロパティに含まれる要素はobject型であるため、今回の場合には文字列型にキャストする必要がある。しかし、埋め込むデータが文字列以外の場合には、こちらの方法がキャストするだけで済むのに対して、先の非表示の列を使った方法ではデータを文字列として埋め込んだり、文字列を元のデータに復元したりする手間がかかる。ただし、DataKeysプロパティでは1つのフィールドの値しか保持できないが、非表示の列はいくつでも追加することができる。![]()
| カテゴリ:Webフォーム 処理対象:DataGridコントロール 使用ライブラリ:DataGridコントロール 使用ライブラリ:HttpResponseクラス(System.Web名前空間) 関連TIPS:[ASP.NET]DataGridコントロールの列にボタンを表示するには? 関連TIPS:[ASP.NET]DataGridコントロールでデータセットを表示するには? |
| 「.NET TIPS」 |
TechTargetジャパン
- 新人プログラマーのためのInsider.NETの歩き方 2012 (2012/5/22)
晴れて.NETプログラマーとなる新人が効率的に開発技術を習得するには? 大量にある記事群の中から新人が読むべきお勧めを厳選して紹介 - jQuery MobileでJavaScriptプログラミング (2012/5/17)
jQuery Mobileは手軽なだけでなく、JavaScriptのAPIも充実しており、独自機能の実装もできる。今回は「グローバル設定」と「イベント」を解説 - Windows上で開発するための開発環境構築入門 (2012/5/16)
Windowsを使ってチームで開発している? なのにサーバOSを設定・運用した経験がない? そうなら、今すぐ学ぼう - 「コントラクト」でアプリのサンドボックスを乗り越える! (2012/5/11)
Metroスタイル・アプリはサンドボックスの中で動作する。それを乗り越えてほかのアプリと連携する仕組み「コントラクト」を解説
|
|
キャリアアップ
スポンサーからのお知らせ
- - PR -
イベントカレンダー
- - PR -



