2010-09-04 13 views
6

Chciałbym wiedzieć, jak dodać kilka dodatkowych węzłów podrzędnych do niestandardowej klasy kontrolnej użytkownika pochodzącej z System.Web.UI. Kontrola.Jak dodać węzły potomne do niestandardowej kontroli użytkownika asp.net pochodzącej z System.Web.UI.Control

Na przykład obecnie mam kontrolę, która nie zawiera węzłów potomnych, a na powierzchni projektowej wygląda następująco.

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

Co szukam ma mieć możliwość dodawania n liczba węzłów podrzędnych do tej kontroli z powierzchni projektowej, a następnie uzyskać dostęp do ich wartości z kodu. Tak więc dodanie do kontroli, o której mowa powyżej.

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

Nie jest dla mnie jasne, jak uzyskać dostęp do węzłów podrzędnych.

Dowiemy się, jak to zrobić.

+1

Podałem odpowiedź, która jest * prawie * tym, co robisz pod względem znaczników - daj mi znać, jeśli * musisz * mieć znacznik w formacie, który pokazałeś. * Myślę, że to jest możliwe i będzie miał root dla ciebie, aby zobaczyć, czy mam gdzieś na niego odpowiedź =) – Rob

+1

@Rob, to dokładnie to, czego szukałem, a właściwie dodatkowy węzeł nadrzędny " Dzieci "są o wiele lepsze, ponieważ możesz bardziej dokładnie opisać, co reprezentują węzły dzieci. Dziękuję bardzo!! – Doug

+1

no problemo, cieszę się, że mogłem pomóc =) (I zgadzam się z tobą ponownie: dodatkowy węzeł nadrzędny) – Rob

Odpowiedz

6

Chcesz móc describe asp.net control properties declaratively.

Aby móc mieć następujące znaczniki:

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

Potrzebny jest następujący kod:

[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

Jeśli chciał wesprzeć daną składnię jak jest (bez konieczności używania prefiksy tag), można użyć 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); 
    } 
} 

Zobacz również http://msdn.microsoft.com/en-us/library/system.web.ui.controlbuilder.aspx

+0

Dziękuję - to także bardzo cenna informacja. – Doug

Powiązane problemy