2010-03-15 27 views
9

he construir una costumbre WebControl, que tiene la siguiente estructura:Render varias colecciones de control en ASP.NET control personalizado

<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> 

el control contiene dos propiedades ControlCollection, 'contenido' y 'pie de página'. Nunca intentado construir un control con varias colecciones de control, pero lo resolvió así (simplificado):

[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); 
     } 
    } 
} 

Sin embargo parece convertir correctamente, ya no funciona si añado algunas etiquetas de entrada y ASP.NET controles dentro de la propiedad (vea el código asp.net anterior). Voy a por el HttpException:

No es posible encontrar el control con id 'KeywordTextBox' que está asociado con la Etiqueta 'KeywordLabel'.

Algo comprensible, porque la etiqueta aparece antes del cuadro de texto en el controlcollection. Sin embargo, con los controles asp.net predeterminados funciona, ¿por qué no funciona? ¿Qué estoy haciendo mal? ¿Es posible incluso tener dos colecciones de control en un control? ¿Debería representarlo de manera diferente?

Gracias por responder.

Respuesta

2

Se pueden utilizar dos paneles como padres de sus dos controlar colecciones (y proporcionarían agrupamiento y legibilidad mejorada). Agregue los controles de cada colección a la colección Controles del panel respectivo, y en el método Render simplemente llame a los métodos de renderizado de cada panel. Los paneles procesarán automáticamente a sus hijos y les proporcionarán su propio espacio de nombres, por lo que puede tener controles con identificaciones similares en paneles diferentes.

+0

Sí, esto funcionará! –

1

No estoy seguro de que funcione. Sin embargo, si utiliza plantillas, puede obtener el control para representar la salida correctamente.

En primer lugar, definir una clase para ser utilizado como el tipo para el control contenedor:

public class ContentsTemplate : Control, INamingContainer 
{ 
} 

Y ahora el control personalizado:

[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

Estoy llegando a un problema similar al op y esto no funcionará. No puede hacer referencia a ningún control dentro de ITemplates, ya que no se crean instancias adecuadas, lo que frustra el objetivo de este tipo de control. – mattmanser

Cuestiones relacionadas