2010-09-04 11 views
6

Me gustaría saber cómo agregar algunos nodos secundarios adicionales a una clase de control de usuario personalizada derivada de System.Web.UI. Controlar.Cómo agregar nodos secundarios al control de usuario asp.net personalizado derivado de System.Web.UI.Control

Por ejemplo, actualmente tengo un control que no contiene nodos secundarios y en la superficie de diseño tiene el siguiente aspecto.

<cust:MyCustomControl id="ctlMyCustomControl" runat="server" attribute1="somevalue" attribute2="somevalue" ></MyCustomControl> 

Lo que busco es tener la posibilidad de añadir un número n de nodos secundarios a este control de la superficie de diseño y luego acceder a sus valores a partir del código. Por lo tanto, agregar al control indicado anteriormente.

<cust:MyCustomControl id="ctlMyCustomControl" runat="server" attribute1="somevalue" attribute2="somevalue" > 
    <childnode1>value1</childnode1> 
    <childnode2>value2</childnode2> 
</MyCustomControl> 

No tengo claro cómo acceder a los nodos secundarios.

Se agradece cualquier idea sobre cómo hacer esto.

+1

He dado una respuesta que es * casi * lo que busca después del marcado: hágame saber si * debe * tener el marcado en el formato que ha mostrado. Yo * creo * es factible y tendrá una raíz para que veas si tengo una respuesta para él en algún lugar =) – Rob

+1

@Rob, esto es exactamente lo que estaba buscando, y en realidad el nodo padre adicional " Los niños "es mucho mejor ya que puede ser más explícito sobre lo que representan los nódulos de los niños. ¡¡Muchas gracias!! – Doug

+1

no hay problema, me alegro de poder ayudar =) (Y estoy de acuerdo con usted en lo siguiente: el nodo padre adicional) – Rob

Respuesta

6

Quiere poder describe asp.net control properties declaratively.

Para poder tener el siguiente marcado:

<Abc:CustomControlUno runat="server" ID="Control1"> 
    <Children> 
     <Abc:Control1Child IntegerProperty="1" StringProperty="Item1" /> 
     <Abc:Control1Child IntegerProperty="2" StringProperty="Item2" /> 
    </Children> 
</Abc:CustomControlUno> 

Es necesario el siguiente código:

[ParseChildren(true)] 
[PersistChildren(true)] 
[ToolboxData("<{0}:CustomControlUno runat=server></{0}:CustomControlUno>")] 
public class CustomControlUno : WebControl, INamingContainer 
{ 
    private Control1ChildrenCollection _children; 

    [PersistenceMode(PersistenceMode.InnerProperty)] 
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] 
    public Control1ChildrenCollection Children 
    { 
     get 
     { 
      if (_children == null) 
       _children = new Control1ChildrenCollection(); 
      return _children; 
     } 
    } 
} 

public class Control1ChildrenCollection : List<Control1Child> 
{ 
} 

public class Control1Child 
{ 

    public int IntegerProperty { get; set; } 
    private string StringProperty { get; set; } 
} 
4

Si quieres apoyar la sintaxis dada tal cual (sin tener que utilizar el prefijos de etiqueta), se puede utilizar un ControlBuilder:

//MyControlBuilder 
public class MyControlBuilder : ControlBuilder 
{ 
    public override Type GetChildControlType(string tagName, IDictionary attribs) 
    { 
    if (tagName.StartsWith("childnode")) return typeof(Control); 
    else return base.GetChildControlType(tagName,attribs); 
    } 

    public override void AppendLiteralString(string s) 
    { 
    //ignore literals betwen tags 
    } 
} 

//MyCustomControl 
[ParseChildren(false)] 
[ControlBuilder(typeof(MyControlBuilder))] 
public class MyCustomControl : Control 
{ 
    public string attribute1 {get;set;} 
    public string attribute2 {get;set;} 

    protected override void AddParsedSubObject(object obj) 
    { 
    Control ctrl = (Control) obj; 
    LiteralControl childNode = ctrl.Controls[0]; 

    //Add as-is (e.g., literal "value1") 
    Controls.Add(childNode); 
    } 
} 

Véase también http://msdn.microsoft.com/en-us/library/system.web.ui.controlbuilder.aspx

+0

Gracias, esta es también una información muy valiosa. – Doug

Cuestiones relacionadas