.NET TIPS [ASP.NET]DataGridコントロールの行に通し番号を付けるには?デジタルアドバンテージ2003/10/03 |
|
|
DataGridコントロールの使用時に、データソースとは無関係な「通し番号」を表示する列が必要となる場合がある。このような場合には、次の<asp:TemplateColumn>要素をDataGridコントロールの<Columns>要素に追加するだけでよい。プログラム・コードを追加する必要はない。
<asp:TemplateColumn HeaderText="No">
<ItemTemplate>
<%# Container.DataSetIndex + 1 %>
</ItemTemplate>
</asp:TemplateColumn>
「TIPS:[ASP.NET]DataGridコントロールで特定のカラムのみを表示するには?」の2番目のサンプル・プログラム(bounddg2.aspx)にこの要素を追加して実行した画面は次のようになる。
通し番号を表示する列を追加したサンプル・プログラム(numberdg.aspx)の実行結果 |
このプログラムの全ソース・コードは次のようになる。太字部分が本稿で追加した個所だ。
|
|
通し番号を表示する列を追加したC#のサンプル・プログラム(numberdg.aspx) | |
追加した<asp:TemplateColumn>要素とその内容について次に解説する。
<asp:TemplateColumn>要素による列の定義
DataGridコントロールは、<Columns>要素により表示されるグリッドの列を定義する。<Columns>要素内で定義可能な列には次のような種類がある。
- BoundColumn:連結列(解説しているTIPS)
- HyperLinkColumn:ハイパーリンク列(解説しているTIPS)
- ButtonColumn:ボタン列(解説しているTIPS)
- EditCommandColumn:編集ボタン列(解説しているTIPS)
- TemplateColumn:テンプレート列
最後の「テンプレート列」を除いた4つの列は、汎用的に使用される、特定の種類の項目を表示するために用意されているものである。それ以外の非定型的な列を表示したい場合には、最後に挙げた「テンプレート列」を使用することになる。
テンプレート列では、独自のレイアウトを定義したテンプレートを用いるため、基本的にはどんな形式の列でも表示することできる。もちろんその代わり、記述は少々複雑なものになる。
例えば、データソースに指定したデータテーブルの特定カラムを列として表示するには、上記のサンプル・プログラムでも使用しているように、通常は連結列である<asp:BoundColumn>要素を使用して次のような記述となる。
<asp:BoundColumn DataField="title" HeaderText="タイトル" />
これはテンプレート列である<asp:TemplateColumn>要素を利用して、次のようにも記述できる。
<asp:TemplateColumn HeaderText="タイトル">
<ItemTemplate>
<%# DataBinder.Eval(Container.DataItem, "title") %>
</ItemTemplate>
</asp:TemplateColumn>
テンプレート列ではまずヘッダ行の文字列をHeaderText属性で指定した<asp:TemplateColumn>タグを記述し、次にその列で表示される項目を<ItemTemplate>要素によって記述するのが基本的な使い方だ。
データを特定カラムにテキストとして表示するという用途であれば、<asp:BoundColumn>要素のおかげでずいぶん簡単に記述できることが分かるだろう。しかし、今回表示したい通し番号はデータソースから得られるものでないため、連結列などは使用できず、テンプレート列が必要となる。
DataGridItemクラスのDataSetIndexプロパティ
通し番号の基になるデータについては、データ連結時に各行で設定されるインデックス番号が利用できる。
「TIPS:[ASP.NET]DataGridコントロールの各セルにアクセスするには?」でも解説しているように、データ連結によりDataGridコントロール内には列を表すオブジェクトとしてDataGridItemクラス(System.Web.UI.WebControls名前空間)のオブジェクトがデータソースの要素数分作成される。このとき、DataGridItemオブジェクトのDataSetIndexプロパティには0から始まるインデックス番号がセットされる。よって、これに1を加えた値をそのまま行の通し番号として使用可能だ。
ここでは次のデータ連結式を用いて、インデックス番号に1を加えた値をテキストとして表示している。
<%# Container.DataSetIndex + 1 %>
「TIPS:[ASP.NET]Container.DataItemの正体は?」で解説しているように、DataGridコントロール内に記述したデータ連結式では、ContainerオブジェクトはDataGridItem型であり、データ連結処理中の行(DataGridItemオブジェクト)への参照が代入されている。よってキャストもなしに「Container.DataSetIndex」と記述すれば、その行のインデックス番号が取得できる。
もし書式付きで番号を表示したいのであれば、次のようにしてStringクラス(System名前空間)のFormatメソッドを使用可能だ。
<%# String.Format("{0:D4}", Container.DataSetIndex + 1) %>
この例では通し番号を0埋めの4桁(0001、0002、……)で表示する。
なお、DataGridコントロールで(既定の)ページングを行っている場合でも、DataSetIndexプロパティは正しく設定されるため、ここで示した通し番号表示は有効である。
カテゴリ:Webフォーム 処理対象:DataGridコントロール 使用ライブラリ:DataGridクラス(System.Web.UI.WebControls名前空間) 使用ライブラリ:BoundColumnクラス(System.Web.UI.WebControls名前空間) 使用ライブラリ:TemplateColumnクラス(System.Web.UI.WebControls名前空間) 使用ライブラリ:DataGridItemクラス(System.Web.UI.WebControls名前空間) 使用ライブラリ:Stringクラス(System名前空間) 関連TIPS:[ASP.NET]DataGridコントロールで特定のカラムのみを表示するには? 関連TIPS:[ASP.NET]DataGridコントロールの各セルにアクセスするには? 関連TIPS:[ASP.NET]Container.DataItemの正体は? |
「.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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|