.NET TIPS [ASP.NET]DataGridコントロールの行にデータを埋め込むには?デジタルアドバンテージ2003/10/31 |
|
|
DataGridコントロールを使用する場合、グリッド上に表示しているデータとは別に、各行に固有のデータを持たせたい場合がある。
例えば、次に示したサンプル・プログラムは本Build Insiderの最新記事を表示し、各行の先頭にある[表示]ボタンがクリックされるとその記事本文のページを表示する。データソースとなるデータテーブルには「タイトル」列と「概要」列で表示しているtitleカラムとencodedカラム以外に、記事のURLを含んだlinkカラムが存在するとしよう。[表示]ボタンがクリックされたときにそのページに移動できるようにするには、行ごとに異なるlinkカラムのデータをどのようにしてDataGridコントロールで持たせておくことができるだろうか。
[表示]ボタンがクリックされると記事ページに移動するサンプル・プログラム (datakeys.aspxおよびhiddencolumn.aspx) |
ここではグリッドの各行にデータを埋め込むための方法を2つ紹介する。
非表示の列によるデータの保持
行にデータを埋め込む1つの方法は、実行時には作成されるがHTMLとしては出力されない「非表示の列」をグリッドに含めるというものだ。列を非表示にするには、列の定義でVisible属性をfalseに設定すればよい。
上記のサンプル・プログラムでは、「概要」列の次に、linkカラムのデータに連結する非表示の列を次のようにして定義している。
<asp:DataGrid ……>
<Columns>
……
<asp:BoundColumn
DataField="encoded" 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」 |
- 第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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|