.NET TIPS

[ASP.NET]DeclarativeCatalogPartコントロールでコンテンツ・カタログを定義するには?[2.0、3.0、3.5、C#、VB]

山田 祥寛
2008/02/28

 「TIPS:[ASP.NET]WebPartsコントロールでページ内のコンテンツを編集/再配置するには?」で紹介したように、カタログ・パーツを利用すれば、ページ上から削除したWebパーツを再表示したり、ブラウザ上からインポートしたパーツ定義情報に基づいて新たなパーツをページに追加したりと、ページ上にパーツを再配置するための機能をコーディングレスで実装できる。本稿では、そのようなASP.NET 2.0が標準で提供するカタログ・パーツの1つであるDeclarativeCatalogPartコントロールの機能について紹介する。

 DeclarativeCatalogPartコントロールを利用することで、WebPartZoneコントロールに配置可能なWebパーツのカタログを宣言できる。デフォルトでページに表示したくないWebパーツについては、このDeclarativeCatalogPartコントロールを利用することで、カタログとしてのみ登録しておき、あとから動的にページに追加することが可能となるわけだ。

 次の画面は「RSSリーダ」というWebパーツを動的に追加している例である。

([RSSリーダ]「zone2」を選択して[追加]ボタンをクリック)
DeclarativeCatalogPartコントロールで定義されたカタログを表示
追加したいWebパーツと追加先のゾーンを選択したうえで[追加]ボタンをクリックすると、ページにWebパーツが追加される。

 それではさっそく、DeclarativeCatalogPartコントロールをページに組み込んでみよう。なお、ここで使用するサンプル・アプリケーションは「WebPartsコントロールでページ内のコンテンツを編集/再配置するには?」で作成したWebParts_cs.aspx/WebParts_vb.aspxをベースにしている。本稿ではそこからの差分のみを解説するので、WebPartsコントロールに関する基本的な知識については、こちらのTIPSを参照いただきたい。

 DeclarativeCatalogPartコントロールでは、配下のカタログ定義を2つの方法で設定できる。

(1)WebPartsTemplateテンプレートで静的に定義
(2)ユーザー・コントロールとして定義されたカタログを動的に展開

●(1)WebPartsTemplateテンプレートで静的に定義

 まずは、よりシンプルな静的なカタログ定義の手順を見ていくことにする。

1. ページにDeclarativeCatalogPartコントロールを配置する

 最初に、カタログ定義のためのDeclarativeCatalogPartコントロールをページに追加する。先述のTIPSでも述べているが、DeclarativeCatalogPartコントロールは必ずCatalogZoneコントロールの配下に配置しなければならない点に要注意だ。

Webフォームのページレイアウト
フォームに配置する各コントロールは以下のとおり。
  DeclarativeCatalogPartコントロール(dcp)。

2. カタログ定義を追加する

 DeclarativeCatalogPartコントロールにカタログ定義を追加するには、タスク・メニューから[テンプレートの編集]を選択すればよい。

カタログ定義のためのWebPartsTemplateテンプレートを表示
タスク・メニューから[テンプレートの編集]を選択すると、WebPartTemplateテンプレートが表示される。WebPartsTemplateテンプレートの配下にカタログとして登録したいWebパーツ(サーバ・コントロールやユーザー・コントロールなど)を配置する。

 Webパーツを配置するためのWebPartTemplateテンプレートが表示されるので、あとは、テンプレートの配下にカタログとして登録したいWebパーツ(サーバ・コントロールやユーザー・コントロールなど)を配置するだけだ。

 ここでは、あらかじめ用意しておいたユーザー・コントロール「RssReader.ascx」「SimpleMessage.ascx」をそれぞれ配置しておこう。

WebPartsTemplateテンプレートにユーザー・コントロールを配置
フォームに配置する各ユーザー・コントロールは以下のとおり。
  RssReader.ascx(RSSリーダー)。
  ShortMessage.ascx(ショート・メッセージボード)。

3. Webパーツの情報を定義する

 2までの手順でもDeclarativeCatalogPartコントロールは動作するが、それぞれのパーツ名として「無題」と表示されてしまう。このままでは、それぞれのパーツを識別できないので、最低限、Webパーツのタイトルを設定しておこう。

 ただし、Webパーツにかかわるプロパティは、フォーム・デザイナ(プロパティ・ウィンドウ)からは設定できないので、コード・エディタから直接にタグ記述を編集する必要がある*

* Webパーツのプロパティ定義、および、設定可能なプロパティについては、「TIPS:[ASP.NET]ユーザー・コントロールでパーソナライズ可能なWebパーツを作成するには?」で詳説しているので、併せてご参照いただきたい。

<asp:DeclarativeCatalogPart ID="dcp" runat="server">
  <WebPartsTemplate>
    <uc1:RssReader ID="RssReader1" runat="server"
      title="RSSリーダ" />
    <uc2:SimpleMessage ID="SimpleMessage1" runat="server"
      title="ショート・メッセージボード" />
  </WebPartsTemplate>
</asp:DeclarativeCatalogPart>
Webパーツのプロパティ情報(タイトル)を定義

 コード・エディタでは、エラーを表す緑色の波線が表示されるが、気にすることはない。実行時には正しく認識されるので、ここでは(やや気持ちは悪いものの)無視しておこう。

 以上、ここまでの手順ができたら、ページを実行してみよう。ページをカタログ・モードに切り換えると、ページ下部に、冒頭の画面のような宣言済みカタログが表示されれば成功だ。ページに追加したいWebパーツと追加先のゾーンを選択したうえで、[追加]ボタンをクリックすると、ページにWebパーツ(ここではRSSリーダー)が追加されることが確認できるはずだ。

[参考] 「削除」と「閉じる」

 DeclarativeCatalogPart/ImportCatalogPartコントロールなどで追加したWebパーツのメニューを確認してみよう。

DeclarativeCatalogPart/ImportCatalogPartコントロールなどで追加したWebパーツのメニュー

 上の画面のように[閉じる]と[削除]の項目が表示されるはずだ。両者は一見するとやや分かりにくいが、[閉じる]メニューは単にパーツを非表示に、[削除]メニューはパーツを完全にページから破棄するものである。つまり、[閉じる]メニューで非表示にされたパーツはPageCatalogPartコントロールから復帰することができるが(PropertyGridEditorPartコントロールで設定したプロパティ値も保持される)、[削除]メニューで削除されたパーツはプロパティ情報も含めて完全に破棄され、再度配置するにはDeclarativeCatalogPart/ImportCatalogPartコントロールから行う必要がある。

 なお、[削除]メニューが有効になるのは、DeclarativeCatalogPart/ImportCatalogPartコントロールなどから動的に追加されたパーツに対してのみである。WebPartZpneコントロールに静的に配置されたパーツは[閉じる]ことしかできない。

●(2)ユーザー・コントロールとして定義されたカタログを動的に展開する方法

 冒頭で述べたように、DeclarativeCatalogPartコントロールでは静的にカタログ定義するばかりではない。ユーザー・コントロールで定義されたカタログを動的に読み込み、展開することも可能だ。カタログ定義用のユーザー・コントロールを間に介することで、複数のページで同一のカタログ定義を利用したい場合にも、容易に再利用できるというメリットがある。

1. 新規にユーザー・コントロールを作成する

 まずは、カタログ定義用のユーザー・コントロールWebPartsList.ascxを作成する。WebPartsList.ascxには、以下の画面の要領でカタログとして登録したいWebパーツ(サーバ・コントロールやユーザー・コントロールなど)を配置するだけだ。

WebPartsList.ascxのフォーム・レイアウト
フォームに配置する各Webパーツは以下のとおり。
  RssReader.ascx(RSSリーダ)。
  ShortMessage.ascx(ショート・メッセージ)。

 先ほどと同様、配置したWebパーツに対しては、最低限、コード・エディタからタイトルを設定しておこう。

<uc1:RssReader ID="RssReader1" runat="server"
  title="RSSリーダ" />
<uc2:SimpleMessage ID="SimpleMessage1" runat="server"
  title="ショートメッセージボード" />
Webパーツのプロパティ情報(タイトル)を定義

2. カタログを定義したユーザー・コントロールを読み込む

 これでカタログの準備は完了だ。あとはDeclarativCatalogPartコントロールのWebPartsListUserControlPathプロパティに対して、カタログを定義したユーザー・コントロールのパス(ここでは「~/WebParts/WebPartsList.ascx」)を指定するだけだ。

 また、先ほどWebPartTemplateテンプレートに定義した内容を削除しておこう。

 以上でカタログを動的に展開する手順は完了だ。実際にページを実行し、カタログ・モードに切り替えると、(先ほど同様)ユーザー・コントロールで定義されたカタログがリスト表示される。End of Article

利用可能バージョン:.NET Framework 2.0
利用可能バージョン:.NET Framework 3.0
利用可能バージョン:.NET Framework 3.5
カテゴリ:Webフォーム 処理対象:WebPartsパーツ
使用ライブラリ:DeclarativeCatalogPartコントロール
関連TIPS:[ASP.NET]WebPartsコントロールでページ内のコンテンツを編集/再配置するには?
関連TIPS:[ASP.NET]ユーザー・コントロールでパーソナライズ可能なWebパーツを作成するには?

この記事と関連性の高い別の.NET TIPS
[ASP.NET]WebPartsコントロールでページ内のコンテンツを編集/再配置するには?
[ASP.NET]ユーザー・コントロールでパーソナライズ可能なWebパーツを作成するには?
[ASP.NET]WebPartsコントロールでパーソナライズ・ページを構築するには?
[ASP.NET]PropertyGridEditorPartコントロールでカスタム・プロパティを編集するには?
[ASP.NET]ImportCatalogPartコントロールでパーツ情報をページにインポートするには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム 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 記事ランキング

本日 月間