このように、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>
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.