|
.NET TIPS [ASP.NET]DataGridコントロールでテンプレート列のセルの値を取得するには?デジタルアドバンテージ2003/11/21 |
![]() |
|
|
|
DataGridコントロールのセルに表示されているテキストの取得方法は、定義している列の種類によって異なることがある。まず次のサンプル・プログラムを見ていただきたい。
|
|
| 連結列とテンプレート列により同じフィールドを表示するC#のサンプル・プログラム(tmplcell.aspx) | |
このプログラムでは、連結列とテンプレート列を使用してデータソースの同じフィールド「Year」を表示している。実行結果は次の画面のようになる。
![]() |
| サンプル・プログラムの実行画面 |
ここまでは特に問題ない。次にデータ連結されたグリッドのセルに表示されているテキストの取得について考えてみよう。例えば、次の2行をサンプル・プログラム中の「MyGrid.DataBind();」の後に追加したとき、それぞれどのような値が表示されるだろうか?
Response.Write(MyGrid.Items[0].Cells[0].Text);
Response.Write(MyGrid.Items[0].Cells[1].Text);
最初の行では、連結列により作成されたセルのテキストを表示しようとしており、これは正しく「2003」を出力する。問題は2行目で、この行は何も出力しない。これは、テンプレート列の場合には、セル(TableCellオブジェクト)のTextプロパティからそのテキストを取得できないということを示している。
テンプレート列のDataBoundLiteralControlオブジェクト
セルのTextプロパティからテキストを取得できない理由は、次のように@PageディレクティブにTrace="true"属性を追加してからプログラムを実行し、ページを構成するコントロールのツリーを見れば分かる。
<%@ Page Language="C#" Trace="true" %>
![]() |
||||||
| サンプル・プログラムのコントロール・ツリー | ||||||
| @PageディレクティブにTrace="true"属性を追加すると表示される。 | ||||||
|
ツリーから分かるように、テンプレート列によるセルにはDataBoundLiteralControlクラス(System.Web.UI名前空間)のオブジェクトが含まれている。このオブジェクトは、DataGridコントロールでデータ連結式(<%# …… %>)を記述したときに作成される文字列表示のためのコントロールである。
つまり、連結列ではTableCellオブジェクトのTextプロパティによりテキストが設定されているのに対して、テンプレート列ではTableCellオブジェクトの子コントロールとしてDataBoundLiteralControlオブジェクトが作成され、そのTextプロパティによってテキストが表示されるということだ。
よって、上述した2番目のResponse.Writeメソッドは、正しくは次のように記述しなくてはならない。
DataBoundLiteralControl literal
= (DataBoundLiteralControl)MyGrid.Items[0].Cells[1].Controls[0];
Response.Write(literal.Text);
これは正しく「2003」を表示する。
Labelコントロールを使用したテンプレート列
テンプレート列でDataBoundLiteralControlオブジェクトが作成されるのは、データ連結式を<ItemTemplate>要素に直接記述した場合である。
テンプレート列で項目を表示するには、次のようなLabelコントロールを含んだテンプレート列を記述してもよい。
<asp:TemplateColumn HeaderText="テンプレート列">
<ItemTemplate>
<asp:Label id="GridLabel"
Text='<%# DataBinder.Eval(Container.DataItem, "Year") %>'
runat="server" />
</ItemTemplate>
</asp:TemplateColumn>
このようにテンプレート列にコントロールを埋め込む場合には、そのid属性によりコントロールに名前を付けられるので、次のようにしてFindControlメソッドによりコントロールにアクセスできる。
Label label = (Label)MyGrid.Items[0].FindControl("GridLabel");
Response.Write(label.Text);
なお、テキスト表示だけならLabelコントロールの代わりにLiteralコントロールも使用可能である。![]()
| カテゴリ:Webフォーム 処理対象:DataGridコントロール 使用ライブラリ:DataGridコントロール 使用ライブラリ:DataBoundLiteralControlクラス(System.Web.UI名前空間) |
| 「.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 -




