2009-07-28 8 views
0

J'ai créé un contrôle serveur personnalisé avec des propriétés implémentant l'interface ITemplate. Il s'agit essentiellement d'une boîte de panneau personnalisé avec un en-tête, un corps & footer. Voici le code:Recherche de contrôles dans un contrôle personnalisé ITemplated


using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Linq; 
using System.Text; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Web.UI.HtmlControls; 

namespace ACME.Web.Controls 
{ 
    [ParseChildren(true)] 
    [DefaultProperty("Text")] 
    [ToolboxData("")] 
    public class Panel : WebControl, INamingContainer 
    { 

     private ITemplate _header = null; 
     private Control _headerControl = null; 
     private Control _headerContainerControl = null; 

     private ITemplate _content = null; 
     private Control _contentControl = null; 
     private Control _contentContainerControl = null; 

     private ITemplate _footer = null; 
     private Control _footerControl = null; 
     private Control _footerContainerControl = null; 

     [PersistenceMode(PersistenceMode.InnerProperty), 
      TemplateContainer(typeof(TemplateControl)), 
      TemplateInstance(TemplateInstance.Single)] 
     public ITemplate Header 
     { 
      get { return _header; } 
      set { _header = value; } 
     } 

     [PersistenceMode(PersistenceMode.InnerProperty), 
      TemplateContainer(typeof(TemplateControl)), 
      TemplateInstance(TemplateInstance.Single)] 
     public ITemplate Content 
     { 
      get { return _content; } 
      set { _content = value; } 
     } 

     [PersistenceMode(PersistenceMode.InnerProperty), 
      TemplateContainer(typeof(TemplateControl)), 
      TemplateInstance(TemplateInstance.Single)] 
     public ITemplate Footer 
     { 
      get { return _footer; } 
      set { _footer = value; } 
     } 

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

      if (this.ID == null) this.ID = "panel-" + Guid.NewGuid().ToString(); 

      this.CssClass = "panel"; 

      if (this.Header == null) 
      { 
       this.CssClass += " without-header"; 
      } 
      else 
      { 
       this.CssClass += " with-header"; 

       _headerControl = new System.Web.UI.WebControls.Panel { CssClass = "panel-header" }; 
       _headerControl.Controls.Add(new System.Web.UI.WebControls.Panel { CssClass = "panel-header-l" }); 
       _headerControl.Controls.Add(new System.Web.UI.WebControls.Panel { CssClass = "panel-header-c" }); 
       _headerControl.Controls.Add(new System.Web.UI.WebControls.Panel { CssClass = "panel-header-r" }); 

       _headerControl.Controls[1].Controls.Add(new System.Web.UI.WebControls.Panel { CssClass = "panel-header-wrapper" }); 
       _headerControl.Controls[1].Controls[0].Controls.Add(new System.Web.UI.WebControls.Panel { CssClass = "wrapper" }); 

       _headerContainerControl = new Control(); 
       if (this.Header != null) 
       { 
        Header.InstantiateIn(_headerContainerControl); 
       } 
       else 
       { 
        _headerContainerControl.Controls.Add(new LiteralControl("Test")); 
       } 

       _headerControl.Controls[1].Controls[0].Controls[0].Controls.Add(_headerContainerControl); 
       Controls.Add(_headerControl); 
      } 

      _contentControl = new System.Web.UI.WebControls.Panel { CssClass = "panel-body" }; 
      _contentControl.Controls.Add(new System.Web.UI.WebControls.Panel { CssClass = "panel-body-t" }); 
      _contentControl.Controls[0].Controls.Add(new System.Web.UI.WebControls.Panel { CssClass = "panel-body-t-l" }); 
      _contentControl.Controls[0].Controls.Add(new System.Web.UI.WebControls.Panel { CssClass = "panel-body-t-c" }); 
      _contentControl.Controls[0].Controls.Add(new System.Web.UI.WebControls.Panel { CssClass = "panel-body-t-r" }); 

      _contentControl.Controls.Add(new System.Web.UI.WebControls.Panel { CssClass = "panel-body-m" }); 
      _contentControl.Controls[1].Controls.Add(new System.Web.UI.WebControls.Panel { CssClass = "panel-body-m-l" }); 
      _contentControl.Controls[1].Controls.Add(new System.Web.UI.WebControls.Panel { CssClass = "panel-body-m-c" }); 
      _contentControl.Controls[1].Controls.Add(new System.Web.UI.WebControls.Panel { CssClass = "panel-body-m-r" }); 

      _contentControl.Controls[1].Controls[1].Controls.Add(new System.Web.UI.WebControls.Panel { CssClass = "panel-body-wrapper" }); 
      _contentControl.Controls[1].Controls[1].Controls[0].Controls.Add(new System.Web.UI.WebControls.Panel { CssClass = "scroll-wrapper" }); 

      _contentControl.Controls.Add(new System.Web.UI.WebControls.Panel { CssClass = "panel-body-b" }); 
      _contentControl.Controls[2].Controls.Add(new System.Web.UI.WebControls.Panel { CssClass = "panel-body-b-l" }); 
      _contentControl.Controls[2].Controls.Add(new System.Web.UI.WebControls.Panel { CssClass = "panel-body-b-c" }); 
      _contentControl.Controls[2].Controls.Add(new System.Web.UI.WebControls.Panel { CssClass = "panel-body-b-r" }); 

      _contentContainerControl = new Control(); 
      if (this.Content != null) 
      { 
       Content.InstantiateIn(_contentContainerControl); 
      } 
      else 
      { 
       _contentContainerControl.Controls.Add(new LiteralControl("Test")); 
      } 

      _contentControl.Controls[1].Controls[1].Controls[0].Controls[0].Controls.Add(_contentContainerControl); 
      Controls.Add(_contentControl); 

      if (this.Footer == null) 
      { 
       this.CssClass += " without-footer"; 
      } 
      else 
      { 
       this.CssClass += " with-footer"; 
       _footerControl = new System.Web.UI.WebControls.Panel { CssClass = "panel-footer" }; 

       _footerContainerControl = new Control(); 
       if (this.Footer != null) 
       { 
        Footer.InstantiateIn(_footerContainerControl); 
       } 
       else 
       { 
        _footerContainerControl.Controls.Add(new LiteralControl("Test")); 
       } 

       _footerControl.Controls.Add(_footerContainerControl); 
       Controls.Add(_footerControl); 
      } 

     } 

     protected override HtmlTextWriterTag TagKey 
     { 
      get { return HtmlTextWriterTag.Div; } 
     } 

    } 

} 

Cela fonctionne parfaitement, mais on ne peut pas vraiment accéder aux contrôles dans les ITemplates à partir du code derrière. J'aimerais pouvoir ajouter et supprimer des contrôles dans les régions ITemplate de mon contrôle personnalisé. Quelle serait la meilleure façon de faire cela?

Répondre

0

vous pouvez essayer container.findcontrol (« »)

+0

J'espérais une solution plus élégante mais il fonctionne, merci – Raybiez

Questions connexes