2010-03-15 23 views
9

Ho costruire un costume WebControl, che ha la seguente struttura:Render collezioni di controllo multipli in ASP.NET controllo personalizzato

<gws:ModalBox ID="ModalBox1" HeaderText="Title" runat="server"> 
    <Contents> 
     <asp:Label ID="KeywordLabel" AssociatedControlID="KeywordTextBox" runat="server">Keyword: </asp:Label><br /> 
     <asp:TextBox ID="KeywordTextBox" Text="" runat="server" /> 
    </Contents> 
    <Footer>(controls...)</Footer> 
</gws:ModalBox> 

il controllo contiene due proprietà ControlCollection, 'Contenuti' e 'piè di pagina'. Mai provato a costruire un controllo con le collezioni di controllo multipli, ma risolto in questo modo (semplificato):

[PersistChildren(false), ParseChildren(true)] 
public class ModalBox : WebControl 
{ 
    private ControlCollection _contents; 
    private ControlCollection _footer; 

    public ModalBox() 
     : base() 
    { 
     this._contents = base.CreateControlCollection(); 
     this._footer = base.CreateControlCollection(); 
    } 

    [PersistenceMode(PersistenceMode.InnerProperty)] 
    public ControlCollection Contents { get { return this._contents; } } 

    [PersistenceMode(PersistenceMode.InnerProperty)] 
    public ControlCollection Footer { get { return this._footer; } } 

    protected override void RenderContents(HtmlTextWriter output) 
    { 
     // Render content controls. 
     foreach (Control control in this.Contents) 
     { 
      control.RenderControl(output); 
     } 

     // Render footer controls. 
     foreach (Control control in this.Footer) 
     { 
      control.RenderControl(output); 
     } 
    } 
} 

Tuttavia sembra rendere correttamente, non funziona più se aggiungo alcune etichette asp.net e di ingresso controlli all'interno della proprietà (vedi sopra il codice asp.net). Prendo il HttpException:

Impossibile trovare il controllo con id 'KeywordTextBox' che è associato con l'etichetta 'KeywordLabel'.

Un po 'comprensibile, perché l'etichetta viene visualizzata prima della casella di testo nella raccolta di controllo. Tuttavia, con i controlli predefiniti di asp.net funziona, quindi perché non funziona? Che cosa sto facendo di sbagliato? È persino possibile avere due raccolte di controllo in un unico controllo? Dovrei renderlo diversamente?

Grazie per le risposte.

risposta

2

È possibile utilizzare due pannelli come genitori del vostro due controllare le raccolte (e fornirebbero raggruppamento e migliore leggibilità). Aggiungi i tuoi controlli da ogni collezione alla collezione Controls del rispettivo pannello, e nel metodo Render chiama semplicemente i metodi Render di ciascun pannello. I pannelli renderanno automaticamente i loro figli e forniranno loro il proprio spazio dei nomi, quindi, puoi avere controlli con ID simili in pannelli diversi.

+0

Sì, questo funzionerà! –

1

Non sono sicuro che funzionerà. Se si utilizzano i modelli, tuttavia è possibile ottenere il controllo per rendere l'output correttamente.

In primo luogo, definire una classe da utilizzare come il tipo per il controllo contenitore:

public class ContentsTemplate : Control, INamingContainer 
{ 
} 

E ora il controllo personalizzato:

[PersistChildren(false), ParseChildren(true)] 
public class ModalBox : CompositeControl 
{ 

    [PersistenceMode(PersistenceMode.InnerProperty)] 
    [TemplateContainer(typeof(ContentsTemplate))] 
    public ITemplate Contents { get; set; } 

    [PersistenceMode(PersistenceMode.InnerProperty)] 
    [TemplateContainer(typeof(ContentsTemplate))] 
    public ITemplate Footer { get; set; } 

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

    var contentsItem = new ContentsTemplate(); 
    Contents.InstantiateIn(contentsItem); 
    Controls.Add(contentsItem); 

    var footerItem = new ContentsTemplate(); 
    Footer.InstantiateIn(footerItem); 
    Controls.Add(footerItem); 
    } 

} 
+0

Sto colpendo un problema simile come op e questo non funzionerà. Non è possibile fare riferimento a qualsiasi controllo all'interno di ITemplates poiché non sono stati istanziati correttamente, il che vanifica lo scopo di questo tipo di controllo. – mattmanser

Problemi correlati