.NET TIPS

[ASP.NET]Repeater/DataListコントロールのテンプレートを別ファイルで管理するには?

山田 祥寛
2004/10/08

 ASP.NETには、RepeaterコントロールやDataListコントロールのように、与えられたデータセットを簡単にレイアウトするためのサーバ・コントロールが用意されている。これらのサーバ・コントロールでは、あらかじめ各部のテンプレートを設定しておくだけで、後はサーバ・コントロールが適宜テンプレートを適切な個所に適用し、データソースを整形してくれる。Repeaterコントロール、DataListコントロールで指定可能なテンプレートの種類は以下のとおりだ。

テンプレート 概要
HeaderTemplate ヘッダ部。リストの出力に先立って1回だけ適用
ItemTemplate データ本体。データソースの1レコードごとに適用
AlternationItemTemplate データ本体。データソースの1レコード置きに適用(無指定時はItemTemplateを適用)
SelectedItemTemplate データ本体。行が選択モードにある場合に適用
EditItemTemplate データ本体。行が編集モードにある場合に適用
SeparatorTemplate 区切り部分。データとデータの区切りに適用
FooterTemplate フッタ部。リスト出力の最後に1回だけ適用
Repeater/DataListコントロールで利用可能なテンプレートの種類
Repeater/DataListコントロールは、テンプレートにより概観(=表示方法)を制御できる。ただしRepeaterコントロールでは、SelectedItemTemplateテンプレートやEditItemTemplateテンプレートは利用できない。

 ところでこのテンプレートだが、複雑なレイアウトを定義したい場合にはどうしても冗長になりがちであり、コードの可読性を低下させる一因ともなる。また、テンプレートによっては、複数のページで使い回したいというようなケースも多々あるだろう。そのような場合に、テンプレートを個々のページ(.aspxファイル)にハード・コーディングしてしまうのは好ましくない。

 そこで本稿では、Repeater/DataListコントロールから利用可能なテンプレートを、「.ascx」ファイルとして外部ファイル化する方法について紹介する。なお、本稿で扱うサンプルは、別稿「TIPS:[ASP.NET]データベースの内容をクライアントにダウンロード提供するには?」で紹介したものを修正したものだ。ロジックの詳細については、別稿の方を参照いただきたい。

1. 「.aspx」ファイルからテンプレート部を除外する

 別稿のサンプル・プログラムdl_cs.aspx、dl_vb.aspxからテンプレートの定義部を別ファイルとして取り除いたのが、以下のコードだ。

<%@ Page ContentType="application/octet-stream"
  Language="C#" ResponseEncoding="Shift_JIS" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<script runat="Server">
SqlDataReader objDr;
void Page_Load(Object sender, EventArgs e) {
  Response.AppendHeader("Content-Disposition","attachment; filename=down.csv");
  SqlConnection db=new SqlConnection("Data Source=(local);User ID=sa;Password=sa;Persist Security Info=True;Initial Catalog=dotnet");
  SqlCommand objCom=new SqlCommand("SELECT isbn,title,price,publish,published FROM books ORDER BY published DESC",db);
  db.Open();
  objDr=objCom.ExecuteReader();
  objRep.HeaderTemplate=Page.LoadTemplate("./template_header.ascx");
  objRep.ItemTemplate=Page.LoadTemplate("./template_item_cs.ascx");
  DataBind();
  db.Close();
}
</script>
<asp:Repeater id="objRep" runat="Server" DataSource="<%#objDr %>" />
外部ファイル化したテンプレートを利用するサンプル・プログラム(template_cs.aspx)
 
<%@ Page ContentType="application/octet-stream"
  Language="VB" ResponseEncoding="Shift_JIS" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<script runat="Server">
Dim objDr As SqlDataReader
Sub Page_Load(sender As Object, e As EventArgs)
  Response.AppendHeader("Content-Disposition","attachment; filename=down.csv")
  Dim db As New SqlConnection("Data Source=(local);User ID=sa;Password=sa;Persist Security Info=True;Initial Catalog=dotnet")
  Dim objCom As New SqlCommand("SELECT isbn,title,price,publish,published FROM books ORDER BY published DESC",db)
  db.Open()
  objDr=objCom.ExecuteReader()
  objRep.HeaderTemplate=Page.LoadTemplate("./template_header.ascx")
  objRep.ItemTemplate=Page.LoadTemplate("./template_item_vb.ascx")
  DataBind()
  db.Close()
End Sub
</script>
<asp:Repeater id="objRep" runat="Server" DataSource="<%#objDr %>" />
外部ファイル化したテンプレートを利用するサンプル・プログラム(template_vb.aspx)

 注目していただきたいのは、コード中の太字の部分だ。外部ファイル化したテンプレートは、Page.LoadTemplateメソッドで有効化することができる。

2. テンプレートを外部ファイル化する

 次に、「.aspx」ファイルから除外したテンプレートを、それぞれ「.ascx」ファイルとして外部ファイル化してみよう。まず、ヘッダ部のテンプレートには動的なコードは含まれていないので、C#、VB.NETのコードいずれからも共通して利用することができる。

ISBN,書名,価格,出版社,発刊日
外部ファイル化したC#/VB.NET共通のテンプレート(template_header.ascx)

 動的なコードを含む部分は、C#やVB.NETの言語ごとに作成する。

<%@ Control Language="C#" %>
<%# DataBinder.Eval(((RepeaterItem)Container).DataItem, "isbn") %>,<%# DataBinder.Eval(((RepeaterItem)Container).DataItem, "title") %>,<%# DataBinder.Eval(((RepeaterItem)Container).DataItem, "price") %>,<%# DataBinder.Eval(((RepeaterItem)Container).DataItem, "publish") %>,<%# DataBinder.Eval(((RepeaterItem)Container).DataItem, "published") %>
外部ファイル化したC#のテンプレート(template_item_cs.ascx)
 
<%@ Control Language="VB" %>
<%# DataBinder.Eval(CType(Container,RepeaterItem).DataItem, "isbn") %>,<%# DataBinder.Eval(CType(Container,RepeaterItem).DataItem, "title") %>,<%# DataBinder.Eval(CType(Container,RepeaterItem).DataItem, "price") %>,<%# DataBinder.Eval(CType(Container,RepeaterItem).DataItem, "publish") %>,<%# DataBinder.Eval(CType(Container,RepeaterItem).DataItem, "published") %>
外部ファイル化したVB.NETのテンプレート(template_item_vb.ascx)

 ここで注目していただきたいのは、データバインドの部分だ。分離前のコード(dl_cs.aspx、dl_vb.aspx)では、Container.DataItemと記述していた部分を、「((RepeaterItem)Container).DataItem」(C#の場合。VB.NETは「CType(Container,RepeaterItem).DataItem」)と明示的にキャスト(型変換)しているのがお分かりになるだろうか。これは、分離前はASP.NETが親コントロールを動的に認識して適切な型に変換していたものが、コードを分離したことで自動的に判定できなくなったことによる。テンプレートを外部ファイル化した場合には、必ず明示的な型変換を行う必要があるということを覚えておこう。なお、Container.DataItemに関する詳細は、別稿「TIPS:[ASP.NET]Container.DataItemの正体は?」が詳しいので、併せて参照いただきたい。

 以上で、準備は完了だ。サンプルを実行し、別稿「TIPS:[ASP.NET]データベースの内容をクライアントにダウンロード提供するには?」と同様の結果が得られれば成功だ。End of Article

カテゴリ:Webフォーム 処理対象:テンプレート
使用ライブラリ:Repeaterコントロール
使用ライブラリ:DataListコントロール
使用キーワード:テンプレート
関連TIPS:[ASP.NET]データベースの内容をクライアントにダウンロード提供するには?
関連TIPS:[ASP.NET]Container.DataItemの正体は?
 
この記事と関連性の高い別の.NET TIPS
[ASP.NET]ListViewコントロールで非定型のリストを表示するには?
[ASP.NET]ログイン・コントロールのレイアウトをテンプレート定義するには?
独自の項目テンプレートを作成するには?
[ASP.NET]あらかじめ用意したPDF文書をインポートするには?
[ASP.NET]データベースの内容をクライアントにダウンロード提供するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム 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 記事ランキング

本日 月間