.NET TIPS

[ASP.NET]DataGridコントロールでデータセットを表示するには?

デジタルアドバンテージ
2003/09/19

 ASP.NETのDataGridコントロールは、数あるWebサーバ・コントロールの中でも最も強力で、最も頻繁に使用されるコントロールだ。DataGridコントロールはデータをグリッド形式(表形式)で表示することができる。そして多くの場合、そのデータとしてはデータベースなどから取得したデータセットが使用される。データベースを基幹としたWebアプリケーション構築において、DataGridコントロールとデータセットの組み合わせはASP.NETの王道といってもよいだろう。

 ここでは、データセットのデータをDataGridコントロールで表示するための基本的な記述についてまとめてみる。なお、データセットについての詳細は「連載:ADO.NET基礎講座」の「第4回 データセットを使ったデータベース・アクセス」などを参照していただきたい。

<asp:DataGrid>タグの記述

 さて、Webページ内にDataGridコントロールを表示するにはまず、aspxファイルにおいて<form>タグ内に<asp:DataGrid>タグを記述する。<asp:DataGrid>タグはDataGridコントロールを表し、データ連結により最終的には表(HTMLの<table>要素)に置き換わるものである。

 最もシンプルな<asp:DataGrid>タグの記述は次のようなものになる。

  <form runat="server">
    <asp:DataGrid id="MyGrid" runat="server" />
  </form>

 <asp:DataGrid>タグはサーバ側での処理が必要であるため、runat="server"属性が必須である(今回の例ではデータの表示のみであるため<form>タグについてはこの属性は不要であるが、今後の拡張のために記述しておく)。

 また、DataGridコントロールをコードから参照/操作できるように、id="MyGrid"属性によりDataGridコントロールに「MyGrid」という名前を付けておく。

データソースの設定とデータ連結

 DataGridコントロールにデータセットを表示するために次に必要となる作業は、コードによりDataGridコントロールのデータソース(DataSourceプロパティ)にデータセットを設定し、DataBindメソッドを呼び出してデータ連結を行うことだ。

 ところで、runat="server"属性をつけて記述した<asp:DataGrid>タグは、aspxファイルがC#やVisual Basic .NETのソース・コードに変換され実行されるときには、DataGridクラス(System.Web.UI.WebControls名前空間)のインスタンスとなる。この際、id="MyGrid"属性により名前を付けているとすると、このインスタンスを参照するものとして変数「MyGrid」が使用される(「TIPS:[ASP.NET]ページから生成されたソース・コードを見るには?」にある手順でこれを実際に確認することができる)。

 よって、コードからはDataGridオブジェクトである「MyGrid」に対してデータソースの設定とデータ連結を行えばよい。「ds」という変数名のデータセット(DataSetオブジェクト)に「item」という名前のデータテーブル(DataTableオブジェクト)が含まれているとすると、このためのコードは次のようになる。

MyGrid.DataSource = ds;
MyGrid.DataMember = "item";
MyGrid.DataBind();

 1つのDataGridコントロールには1つの「表」しか表示できないため、データセットに複数のデータテーブルが含まれている場合は、そのうちの1つ指定することになる。DataMemberプロパティはその指定を行うためのものだ。

 あるいは次のようにデータソースに直接データテーブルを指定してもよい。この場合にはDataMemberプロパティの設定は不要となる。

MyGrid.DataSource = ds.Tables["item"];
MyGrid.DataBind();

 DataSourceプロパティに設定可能なオブジェクトは、IListSourceインターフェイス(System.ComponentModel名前空間)あるいはIEnumerableインターフェイス(System.Collections名前空間)を実装しているオブジェクトだ。ちなみに、DataSetクラスとDataTableクラスがIListSourceを実装するクラスである。

列を自動生成するDataGridコントロール

 以上のコードを組み合わせたDataGridコントロールを使用する最もシンプルなプログラムは次のようなものになる。データセットの生成については、データベースを用いるとコードが少々長くなってしまうので、ここではBuild InsiderのRSS情報を使用している(これについては後述)。このサンプル・プログラムはBuild Insiderの新着記事を表示する。

<%@ 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" runat="server" />
  </form>
</body>
</html>
Build Insiderの新着記事を表示するC#のサンプル・プログラム(simpledg1.aspx)

 サンプル・プログラムの実行結果は次のようになる。このサンプル・プログラムはここから実際に実行して試すことができる。

サンプル・プログラム(simpledg1.aspx)の実行結果

 DataGridコントロールの表示についてはまったくのデフォルト設定だ。デフォルトでは、データソースにデータテーブルを指定した場合、そのデータテーブルに含まれる個々のカラムに対応してDataGridコントロールにカラムが自動生成される。このときDataGridコントロールのヘッダー行(一番上の行)にはデータテーブル内の各カラムの名前が使用される(正確にはDataTableオブジェクトに含まれるDataColumnオブジェクトのColumnNameプロパティの値)。

 このようにカラムが自動生成されるのは、DataGridコントロールのAutoGenerateColumnプロパティがデフォルトでtrueとなっているためである。上記の実行画面を見て分かるように、カラム自動生成機能は実システムでは使い物にならない。このデフォルトの設定はテストやプロトタイプ・システムのためのものであるといえるだろう。テーブルの特定のカラムのみをDataGridコントロールで表示する方法については「TIPS:[ASP.NET]DataGridコントロールで特定のカラムのみを表示するには?」を見ていただきたい。

RSS情報をデータセットに読み込むには

 RSS(RDF Site Summary)はWebサイトの更新情報をXMLで記述するための仕様である。@ITでも各フォーラムの新着記事についての情報を「RSSフィードについて」のページで提供している(RSSについての詳細は「特集:サイトの更新情報を提供する標準言語RSS」を参考にしていただきたい)。

 RSS情報はXMLドキュメントなので、サンプル・プログラムで示しているようにDataSetクラスのReadXmlメソッドで簡単に読み込むことができる。

DataSet ds = new DataSet();
ds.ReadXml("http://www.buildinsider.net/rss");

 この場合には、ReadXmlメソッドの実行によりデータセット内に3つのデータテーブルが作成される。上記のサンプル・プログラムでは、この3つのデータテーブルうちの記事のタイトルや記事へのリンク、公開日時などを含んだ「item」という名前のデータテーブルを使用している。

 サンプルとしてちょうどよいので、この3つのデータテーブルの一覧もDataGridコントロールで表示してみよう。これには、先ほどのサンプル・プログラム中のデータソースを設定している1行を次のように修正するだけだ。

MyGrid.DataSource = ds.Tables;

 DataSetクラスのTablesプロパティの型であるDataTableCollectionクラス(System.Data名前空間)はIEnumerableインターフェイスを実装しているため、データソースとして設定可能だ。これによりTablesプロパティに含まれている各DataTableオブジェクトが表形式で表示される。

 実行画面は次のようになる。

データソースをTablesプロパティに設定したサンプル・プログラム(simpledg2.aspx)の実行結果

 この場合にもカラムの自動生成機能が働いているのが分かる。データソースがデータテーブルでない場合、DataGridコントロールはデータソースの各要素オブジェクトから基本的な型(プリミティブ型、string型、DateTime型など)のプロパティについてのみカラムを自動生成生成して、その値を表示する。End of Article

カテゴリ:Webフォーム 処理対象:DataGridコントロール
使用ライブラリ:DataGridコントロール(System.Web.UI.WebControls名前空間)
使用ライブラリ:DataGridクラス(System.Web.UI.WebControls名前空間)
使用ライブラリ:IListSourceインターフェイス(System.ComponentModel名前空間)
使用ライブラリ:IEnumerableインターフェイス(System.Collections名前空間)
使用ライブラリ:DataSetクラス(System.Data名前空間)
使用ライブラリ:DataTableクラス(System.Data名前空間)
使用ライブラリ:DataTableCollectionクラス(System.Data名前空間)
関連TIPS:[ASP.NET]ページから生成されたソース・コードを見るには?
関連TIPS:[ASP.NET]DataGridコントロールで特定のカラムのみを表示するには?
 
この記事と関連性の高い別の.NET TIPS
[ASP.NET]DataGridコントロールで特定のカラムのみを表示するには?
[ASP.NET]DataGridコントロールを階層表示させるには?
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 記事ランキング

本日 月間