さて、ここまででデータアダプタを利用してデータセットにレコードを読み込む手順を示した。残るプロセスは、データセットに読み込まれたレコードにアクセスすることだ。ここからは取得したデータセット内のデータの表示について見ていこう。
データセットのデータを単純に表示するだけなら、DataGridコントロールを使用するのが最も便利な方法だ。DataGridコントロールはグリッド形式(表形式)でデータを表示するためのコントロールで、データセットとペアで使用されることを前提に設計されており、データセットと非常に親和性がよい。
.NET Frameworkには標準でWindowsフォーム用と、Webフォーム用の2種類のDataGridコントロールが用意されている。データを表示させるだけならどちらも簡単なので、両方でやってみよう。
まずWindowsフォーム版では、プログラムは次のようになる。先ほどのデータセットを利用したデータベース・アクセスの処理はMakeDataSetメソッドとしてまとめている。
// windg.cs
using System;
using System.Windows.Forms;
using System.Data;
using System.Data.SqlClient;
public class DataGridForm : Form {
public DataGridForm(DataSet ds) {
DataGrid dg = new DataGrid();
dg.Dock = DockStyle.Fill;
this.Controls.Add(dg);
dg.DataSource = ds;
}
}
public class ShowDataGrid {
static DataSet MakeDataSet() {
string sqlStr = "SELECT pub_id, pub_name FROM publishers";
string connStr = "Server=(local)\\NetSDK;"
+ "Trusted_Connection=yes;"
+ "database=pubs";
SqlDataAdapter da = new SqlDataAdapter(sqlStr, connStr);
DataSet ds = new DataSet();
da.Fill(ds);
return ds;
}
public static void Main() {
DataSet ds = MakeDataSet();
Application.Run(new DataGridForm(ds));
}
}
// コンパイル方法:csc /t:winexe windg.cs
このプログラムを実行すると次のようなウィンドウ(図中の左上のウィンドウ)が表示され、2回のクリックで取得されたレコードを表示することができる。
このプログラムでは、ウィンドウ全面にDataGridコントロールを貼り付けている。データセットに関してポイントとなる部分は次の1行だけだ。
dg.DataSource = ds;
この行では、DataGridオブジェクトのDataSourceプロパティにレコードを読み込んだDataSetオブジェクトをセットしている。これだけでDataGridコントロールはデータセットの内容を解釈し、列名付きでレコードを表示してくれる(この処理は「データ連結」と呼ばれる)。
なお、2回クリックしないとレコード表示までたどり着かないのは、複数のテーブル(DataTableオブジェクト)を保持するデータセットの表示にDataGridコントロールが対応しているためだ。上記の行を次のように変更すれば、最初からDataGridコントロールにレコードが表示される。
dg.DataSource = ds.Tables[0];
右辺のds.Tables[0]は、DataSetオブジェクト内にあるDataTableオブジェクトを直接指定しているわけだが、これについては後述する。DataGridコントロールのDataSourceプロパティは、データの読み込み先としてDataTableオブジェクトを指定することもできる。
一方、WebフォームでDataGridコントロールを使用して、データセットを表示させるプログラムは次のようなものになる。
<%@ Page Language="C#" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<html>
<head>
<script runat="server">
static DataSet MakeDataSet() {
string sqlStr = "SELECT pub_id, pub_name FROM publishers";
string connStr = "Server=(local)\\NetSDK;"
+ "Trusted_Connection=yes;"
+ "database=pubs";
SqlDataAdapter da = new SqlDataAdapter(sqlStr, connStr);
DataSet ds = new DataSet();
da.Fill(ds);
return ds;
}
void Page_Load(object s, EventArgs e) {
DataGrid1.DataSource = MakeDataSet();
DataGrid1.DataBind();
}
</script>
</head>
<body>
<form runat="server">
<asp:DataGrid id="DataGrid1" runat="server"
EnableViewState="false"
HeaderStyle-BackColor="#aaaadd" />
</form>
</body>
</html>
このプログラムは、IISのドキュメント・ルート(c:\inetpub\wwwrootなど)にコピーして、ブラウザから「http://localhost/webdg.aspx」を開けば実行されるはずだ。
実行画面は次のようになる。
プログラムでは、フォームが表示されるときに自動的に呼び出されるPage_Loadメソッドでデータ連結を行っている。
void Page_Load(object s, EventArgs e) {
DataGrid1.DataSource = MakeDataSet();
DataGrid1.DataBind();
}
DataSourceプロパティにデータセットを指定するのはWindowsフォーム版と同様だが、Webフォーム版のDataGridコントロールでは、これに続いてDataBindメソッドの呼び出しが必要になる。このメソッドを呼び出した時点でデータ連結が行われる。
なお、Webフォーム版のDataGridコントロールでは、データセット内に複数のDataTableオブジェクトがある場合には、上記のような記述では自動的に最初のDataTableオブジェクトが選択されるようだ。通常はDataSourceプロパティにDataTableオブジェクトを直接指定したり、DataMemberプロパティによりDataTableオブジェクトの名前を指定したりする。DataTableオブジェクトの名前については後述する。
Copyright© Digital Advantage Corp. All Rights Reserved.