.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.atmarkit.co.jp/rss/fdotnet/rss2dc.xml");

      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="description" 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コントロール
使用ライブラリ:<asp:BoundColumn>要素
使用ライブラリ:<asp:TemplateColumn>要素
使用ライブラリ: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コントロールの編集用テキストボックスを大きくするには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」

TechTargetジャパン

Insider.NET フォーラム 新着記事
  • Kinectが切り開く“夢の近未来” (2012/2/2)
     日本を含めた世界中でKinect for Windowsセンサー商用版とSDK正式版がリリース。未来のコンピューティングはどう変化するのか?
  • 3つの視点でネイティブと.NETの適材適所を考察 (2012/1/31)
     アプリ開発は「ネイティブ」と「.NET」、どちらが最良? その問いには「適材適所」と答えるしかない。では、“適所”は一体どこかを考察する
  • SQL Azure Data Sync入門 (2012/1/30)
     SQL Azure/SQL Serverデータベース間のデータ同期を簡単に実現するサービスとは? その仕組みや使用手順を解説
  • Windows Phoneアプリ市場の現状を分析する (2012/1/27)
     Windows Phone のアプリ・ストアに日々登録されている多種多様なアプリ。カテゴリ別のアプリ数は? 市場の現状を明らかにする

@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

RSSフィード

キャリアアップ

- PR -
@IT Sepcial

イベントカレンダー

PickUpイベント

- PR -
もっと見る
- PR -

お勧め求人情報

ホワイトペーパーTechTargetジャパン

@IT Sepcial
ソリューションFLASH