2009-11-05 5 views
1

Je cherche à créer un WebControl qui peut contenir du balisage à l'intérieur et faire sa propre création dynamique de contrôles enfants. Le problème que j'ai est que je ne peux pas (encore) rendre les contrôles logés dans le balisage (voir l'exemple ci-dessous) séparément des contrôles enfants que je crée.ASP.NET WebControl et le rendu contenaient des enfants

Je suis conscient que je dois mettre en place la classe avec ces 2 drapeaux:

[ParseChildren(false)] 
[PersistChildren(true)] 
public class OuterControl : WebControl 
{ 
    ... 
} 

Et balisage exemple ressemblerait à ceci:

<custom:OuterControl> 
    <asp:TextBox ...> 
<custom:OuterControl> 

intérieur RenderContents(), je certains contrôles que je dois ajouter à l'arbre de contrôle, restituer, puis rendre ceux enveloppés dans le balisage dans une partie particulière. .: par exemple

protected override void RenderContents(HtmlTextWriter output) 
{ 
    EnsureChildControls(); 
    [ Misc work, render my controls ] 

    [** Would like to render wrapped children here **] 

    [ Possibly other misc work ] 
} 

Comme il est dit, je peux soit obtenir mes commandes créé le code à rendre deux fois d'appeler RenderChildren(), ou les contrôles enveloppées ne pas rendre du tout en supprimant cette ligne. Zut.

Pensées?

Répondre

1

Quand j'avais une exigence similaire (la construction d'un ensemble standard de contrôles autour des contrôles fournis), je fini par faire quelque chose comme ceci:

EnsureChildControls(); 

Control[] currentControls = new Control[Controls.Count]; 

if (HasControls()) { 
    Controls.CopyTo(currentControls, 0); 
    Controls.Clear(); 
} 

// Misc work, add my controls, etc, e.g. 
Panel contentBox = new Panel { ID = "Content", CssClass = "content_border" }; 
// at some point, add wrapped controls to a control collection 
foreach (Control currentControl in currentControls) { 
    contentBox.Controls.Add(currentControl); 
} 

// Finally, add new controls back into Control collection 
Controls.Add(contentBox); 

qui a occupé assez bien.

Questions connexes