2009-07-04 14 views
1

ASP.NETテンプレートシステムを使用するコンポジットコントロールを使用しています。テンプレート化されたASP.NETコントロールの作成

私のマークアップでHeaderTemplateとFooterTemplateを定義し、その間にusercontrolをプログラムで追加できます。

私が目指してるのマークアップは、このようなものです:

<asp:DropZone runat="server" ID="LeftZone"> 
    <HeaderTemplate> 
     <h1>Getting started</h1> 
    </HeaderTemplate> 
    <FooterTemplate> 
     <h3>The end of it...</h3> 
    </FooterTemplate> 
</asp:DropZone> 

マイドロップゾーンクラスは、次のようになります。

public class DropZone : Control, INamingContainer 
    { 
     private ITemplate headerTemplate; 
     private ITemplate footerTemplate; 

     [DefaultValue((string)null), Browsable(false), PersistenceMode(PersistenceMode.InnerProperty), TemplateInstance(TemplateInstance.Single)] 
     public virtual ITemplate HeaderTemplate 
     { 
      get { return headerTemplate; } 
      set { headerTemplate = value; } 
     } 

     [DefaultValue((string)null), Browsable(false), PersistenceMode(PersistenceMode.InnerProperty), TemplateInstance(TemplateInstance.Single)] 
     public ITemplate FooterTemplate 
     { 
      get { return footerTemplate; } 
      set { footerTemplate = value; } 
     } 

     protected override void OnInit(EventArgs e) 
     { 
      EnsureChildControls(); 
      base.OnInit(e); 
     } 

     private void AppendTemplate(ITemplate template, Control container) 
     { 
      if (template == null) return; 

      var ph = new PlaceHolder(); 
      container.Controls.Add(ph); 
      template.InstantiateIn(ph); 
     } 

     protected override void CreateChildControls() 
     { 
      Controls.Clear(); 

      AppendTemplate(HeaderTemplate, this); 

      Control helloWorld = Page.LoadControl("~/WebParts/HelloWorld.ascx"); 
      if (helloWorld != null) 
      { 
       Controls.Add(helloWorld); 
      } 

      AppendTemplate(FooterTemplate, this); 

      ChildControlsCreated = true; 
      base.CreateChildControls(); 
     } 
    } 

ITemplateフィールドがインスタンス化されることはありませんしかし、これは動作しません。 。

ご迷惑をおかけして申し訳ございません。

ありがとうございました。

更新:私は、カスタムコントロールをCompositeControlから派生させて、正常に機能するようにしなければなりませんでした。

答えて

2
+0

ありがとうございます。どうやら、Controlの代わりにCompositeControlからDropZoneコントロールを派生させる必要があります。今はすべてが期待通りに機能します。 –

+0

ああ、そうです。 CompositeControlはあなたの友人です。 –

+0

複合コントロールの代わりにINamingContainerを実装することもできます。ユニークなIDが確実に出力されるようにするマーカーテンプレートです。 CompositeControlがこれを実行します。そのため、これが機能します。 –

関連する問題