第11回 Webフォームにおけるデータ連結       Part3 DataGridコントロール連載 プログラミングASP.NET ―ASP.NETによるWebアプリケーション実践開発講座― (2/3 ページ)

» 2002年12月12日 00時00分 公開
[田口景介]

■カラムとasp:BoundColumnコントロール

 このように、asp:DataGridコントロールではカラムの数だけテンプレートを定義しなければならないため、手間がかかるうえ、複雑になるとミスを犯しがちだ。そこで、定型フォーマットにのっとったカラムであれば簡単に定義できるように、カラムとテンプレートの定義をまとめた特別なカラム・コントロールが幾つか用意されている。

 そのうちの1つがasp:BoundColumnコントロールである。このコントロールを使うと以下のカラム定義を、

  <asp:TemplateColumn>
    <ItemTemplate>
      <%# DataBinder.Eval(Container.DataItem, "<フィールド>") %>
    </ItemTemplate>
  </asp:TemplateColumn>

 次のように書き換えることができる。テンプレート定義が省略できる分、だいぶシンプルになったことが分かるだろう。

  <asp:BoundColumn DataField="<フィールド>" />

 このasp:BoundColumnコントロールを利用すれば、リスト11.2のasp:DataGridコントロールをリスト11.3に示すように書き換えられる。1つの要素が1つのセルに出力されるasp:DataListコントロールとは異なり、asp:DataGridコントロールは1つの要素を複数のカラムに出力できるため、個々のセルにはごく単純なデータしか出力されないことが多い。そのため、asp:BoundColumnコントロールの利用頻度は高いはずだ。

<%@ PAGE LANGUAGE="C#" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.IO" %>
<html>
<head>
<script runat="server">
void Page_Load(object sender, EventArgs e) {
  if (!IsPostBack) {
    datagrid1.DataSource = CreateDataSource();
    datagrid1.DataBind();
  }
}

ICollection CreateDataSource() {
  DirectoryInfo di = new DirectoryInfo(Server.MapPath("."));
  FileInfo[] fi = di.GetFiles();

  DataTable dt = new DataTable();
  DataRow dr;

  dt.Columns.Add(new DataColumn("fileid", typeof(int)));
  dt.Columns.Add(new DataColumn("filename", typeof(String)));
  dt.Columns.Add(new DataColumn("filesize", typeof(long)));
  dt.Columns.Add(new DataColumn("date", typeof(DateTime)));

  for (int i = 0; i < fi.Length; i++) {
    dr = dt.NewRow();
    dr[0] = i;
    dr[1] = fi[i].Name;
    dr[2] = fi[i].Length;
    dr[3] = fi[i].LastWriteTime;
    dt.Rows.Add(dr);
  }

  DataView dv = new DataView(dt);

  return dv;
}

</script>
</head>
<body>
<form runat="server">
  <div align="center">
  <asp:DataGrid id="datagrid1"
    AutoGenerateColumns="false"
    runat="server">
    <Columns>
    <asp:BoundColumn HeaderText="ファイル名" DataField="filename" />
    <asp:BoundColumn HeaderText="サイズ" DataField="filesize" />
    <asp:BoundColumn HeaderText="更新日時" DataField="date" />
    </Columns>
  </asp:DataGrid>
  <asp:Label id="Message" runat="server" />
  </div>
</form>
</body>
</html>

リスト11.3 asp:BoundColumnコントロール(sample12.aspx)
sample12.aspxのダウンロード(sample12.zip)

 asp:BoundColumnコントロールには、asp:TemplateColumnと同じように表11.3に示す属性が用意されている。ここで注目すべきは前述したDataField属性とDataFormatString属性である。DataFormatString属性を指定すると、String.Formatメソッドと同様の文法で、文字列の出力フォーマットを制御できる。データ連結式を記述できないasp:BoundColumnコントロールだが、この属性を指定することで、多少のカスタマイズが可能になる。

属性 機能
DataField 参照するデータソースのフィールド
DataFormatString 文字列の出力フォーマット
FooterText フッタ文字列
HeaderImageUrl ヘッダに表示する画像のURL
HeaderText ヘッダ文字列
ReadOnly trueのカラムは編集モードになっても編集できない
SortExpression ソート時に参照するフィールド
Visible カラムを表示するときはtrue
表11.3 asp:BoundColumnコントロールの属性

 なおasp:BoundColumnコントロール以外にも、同種のカラム・コントロールにasp:ButtonColumnコントロールと、asp:HyperLinkColumnコントロールが用意されている。asp:ButtonColumnコントロールを利用すると、

  <asp:TemplateColumn>
    <ItemTemplate>
      <asp:Button
        Text=<%# DataBinder.Eval(Container.DataItem, "<ラベル>") %>
        CommandName="<コマンド名>" runat="server" />
    </ItemTemplate>
  </asp:TemplateColumn>

を以下のように置き換えることができる。asp:Buttonコントロールの代わりにasp:LinkButtonを使いたければ、「ButtonType="LinkButton"」を指定すればよい。

  <asp:ButtonColumn
    ButtonType="PushButton"
    DataTextField="<ラベル>"
    CommandName="<コマンド名>" />

 またasp:HyperLinkColumnコントロールを利用すると、

  <asp:TemplateColumn>
    <ItemTemplate>
      <asp:HyperLink
        NavigateUrl='<%# DataBinder.Eval(Container.DataItem, "<URL>") %>'
        Text='<%# DataBinder.Eval(Container.DataItem, "<ラベル>") %>'
        runat="server" />
    </ItemTemplate>
  </asp:TemplateColumn>

を以下のように置き換えることができる。

  <asp:HyperLinkColumn
    DataNavigateUrlField="<URL>"
    DataTextField="<ラベル>" />

 どちらもasp:BoundColumnコントロールほどには使われることはないだろうが、うまく条件が合えば、テンプレートの定義を単純化できる。

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。