.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)の実行結果

 このプログラムの全ソース・コードは次のようになる。太字部分が本稿で追加した個所だ。

<%@ Page Language="C#" EnableViewState="false" %>
<%@ Import Namespace="System.Data" %>

<html>
<head>
  <script runat="server">
    void Page_Load(object sender, EventArgs e) {
      DataSet ds = new DataSet();
      ds.ReadXml("http://www.buildinsider.net/rss");

      MyGrid.DataSource = ds.Tables["item"];
      MyGrid.DataBind();
    }
  </script>
</head>

<body>
  <form runat="server">
    <asp:DataGrid id="MyGrid"
        AutoGenerateColumns="false"
        CellPadding="4"
        runat="server" >

      <HeaderStyle BackColor="#BB2255" ForeColor="white"/>
      <ItemStyle   BackColor="#FFEEEE" />
      <AlternatingItemStyle BackColor="#FFDDDD" />

      <Columns>
        <asp:TemplateColumn HeaderText="No">
          <ItemTemplate>
            <%# Container.DataSetIndex + 1 %>
          </ItemTemplate>
        </asp:TemplateColumn>


        <asp:BoundColumn
            DataField="title" HeaderText="タイトル" />
        <asp:BoundColumn
            DataField="encoded" HeaderText="概要" />
      </Columns>

    </asp:DataGrid>
  </form>
</body>
</html>
通し番号を表示する列を追加したC#のサンプル・プログラム(numberdg.aspx)

 追加した<asp:TemplateColumn>要素とその内容について次に解説する。

<asp:TemplateColumn>要素による列の定義

 DataGridコントロールは、<Columns>要素により表示されるグリッドの列を定義する。<Columns>要素内で定義可能な列には次のような種類がある。

 最後の「テンプレート列」を除いた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プロパティは正しく設定されるため、ここで示した通し番号表示は有効である。End of Article

カテゴリ: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
[ASP.NET]DataGridコントロールの編集用テキストボックスをカスタマイズするには?
[ASP.NET]DataGridコントロールのハイパーリンク列で複数のパラメータをデータ連結するには?
[ASP.NET]DataGridコントロールでテンプレート列のセルの値を取得するには?
[ASP.NET]DataGridコントロールのフッターに入力機能を追加するには?
[ASP.NET]DataGridコントロールの列に複数の項目を表示するには?
[ASP.NET]DataGridコントロールの編集用テキストボックスを大きくするには?
[ASP.NET]DataGridコントロールの行にデータを埋め込むには?
[ASP.NET]DataGridコントロールの各セルにアクセスするには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間