1

Je voudrais pouvoir faire quelque chose comme:Possibilité d'avoir un contrôle interne sur un contrôle serveur personnalisé?

<ui:Tab Title="A nice title"> 
    <TabTemplate> 
    <asp:Literal runat="server" ID="SetMe">With Text or Something</asp:Literal> 
    </TabTemplate> 
</ui:Tab> 

mais aussi être en mesure de le faire:

<ui:Tab Title="A nice title"> 
    <TabTemplate> 
    <asp:DataList runat="server" ID="BindMe"></asp:DataList> 
    </TabTemplate> 
</ui:Tab> 

code réponse Je suis finalement venu avec:

[ParseChildren(true)] 
public class Node : SiteMapNodeBaseControl, INamingContainer 
{ 
    private ITemplate tabTemplate; 
    [Browsable(false), 
    DefaultValue(null), 
    Description("The tab template."), 
    PersistenceMode(PersistenceMode.InnerProperty), 
    TemplateContainer(typeof(TabTemplate))] 
    public ITemplate TabTemplate 
    { 
     get { return tabTemplate; } 
     set { tabTemplate = value; } 
    } 
    protected override void CreateChildControls() 
    { 
     if (TabTemplate != null) 
     { 
      Controls.Clear(); 
      TabTemplate i = new TabTemplate(); 
      TabTemplate.InstantiateIn(i); 
      Controls.Add(i); 
     } 
    } 
    protected override void Render(HtmlTextWriter writer) 
    { 
     EnsureChildControls(); 
     base.Render(writer); 
    } 
} 


public class TabTemplate : Control, INamingContainer 
{ 
} 

Répondre

1

Le L'attribut ParseChildren indique à .NET s'il faut traiter les enfants de votre contrôle en tant que propriétés ou en tant que contrôles. Pour votre premier exemple, vous voulez traiter les enfants comme les contrôles, il faut donc ajouter

[ ParseChildren(ChildrenAsProperties = false) ] 

Pour la deuxième, vous voulez ChildrenAsProperties = true, et une propriété de type TabTemplate ITemplate. Il y a une certaine plomberie impliquée après cela, qui décrit this MSDN sample. Cependant, cela n'ajoute pas beaucoup de valeur si vous n'avez besoin que d'un seul modèle.

+0

J'ai collé ce que j'ai jusqu'ici. Presque ...: P – rball

Questions connexes