.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プロパティからアクセス可能)を使用してページの移動を行っている。

 プログラムの全ソース・コードは次のようになっている。

<%@ 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();
    }

    void Grid_Command(object sender, DataGridCommandEventArgs e) {
      Response.Redirect(e.Item.Cells[3].Text);
    }
  </script>
</head>

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

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

      <Columns>
        <asp:ButtonColumn
            Text="表示"
            ButtonType="PushButton"
            HeaderStyle-Wrap="false"
            HeaderText="ボタン" />
        <asp:BoundColumn
            DataField="title" HeaderText="タイトル" />
        <asp:BoundColumn
            DataField="encoded" HeaderText="概要" />
        <asp:BoundColumn
            Visible="false"
            DataField="link" />

      </Columns>

    </asp:DataGrid>
  </form>
</body>
</html>
非表示の列を使用した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属性を使用したバージョンのサンプル・プログラムの全ソース・コードは次のようになる。

<%@ 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();
    }

    void Grid_Command(object sender, DataGridCommandEventArgs e) {
      Response.Redirect(
         (string)MyGrid.DataKeys[e.Item.ItemIndex]);

    }
  </script>
</head>

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

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

      <Columns>
        <asp:ButtonColumn
            Text="表示"
            ButtonType="PushButton"
            HeaderStyle-Wrap="false"
            HeaderText="ボタン" />
        <asp:BoundColumn
            DataField="title" HeaderText="タイトル" />
        <asp:BoundColumn
            DataField="encoded" HeaderText="概要" />
      </Columns>

    </asp:DataGrid>
  </form>
</body>
</html>
DataKeysプロパティを使用したサンプル・プログラム(datakeys.aspx)

 DataKeysプロパティに含まれる要素はobject型であるため、今回の場合には文字列型にキャストする必要がある。しかし、埋め込むデータが文字列以外の場合には、こちらの方法がキャストするだけで済むのに対して、先の非表示の列を使った方法ではデータを文字列として埋め込んだり、文字列を元のデータに復元したりする手間がかかる。ただし、DataKeysプロパティでは1つのフィールドの値しか保持できないが、非表示の列はいくつでも追加することができる。End of Article

カテゴリ:Webフォーム 処理対象:DataGridコントロール
使用ライブラリ:DataGridコントロール
使用ライブラリ:HttpResponseクラス(System.Web名前空間)
関連TIPS:[ASP.NET]DataGridコントロールの列にボタンを表示するには?
関連TIPS:[ASP.NET]DataGridコントロールでデータセットを表示するには?
 
この記事と関連性の高い別の.NET TIPS
[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 記事ランキング

本日 月間