2009-11-20 4 views
3

Je dois utiliser objChildControl.RenderControl ou objControl.RenderChildren pour rendre manuellement mes contrôles enfants. Mais il semble que ces méthodes sont incomplètes.RenderControl ou RenderChildren ASP.NET échouent

Tous mes contrôles enfants utilisent l'événement OnPreRender pour enregistrer les feuilles de style clientScript et client (car celles-ci ne peuvent être créées que dans l'événement prerender).

J'ai deux problèmes principaux, en passant l'objet System.Web.UI.Page actuel à un contrôle enfant et en vérifiant que l'événement OnPreRender est déclenché sur ces contrôles enfants.

Il semble que je ne puisse pas utiliser la méthode RenderControl sur mes contrôles enfants, car l'événement OnPreRender ne sera pas appelé. Je peux cependant passer l'objet Page par objChildControl.Page = Me.Page

Lorsque j'utilise RenderChildren, je ne peux pas passer l'objet Page, ou puis-je? Et je ne suis pas sûr si l'événement OnPreRender est même appelé quand j'utilise RenderChildren.

Une aide serait appréciée, depuis que je suis coincé;)

Mise à jour

J'ai trouvé un moyen d'obtenir le résultat que j'ai besoin, mais ce n'est pas la solution que je veux. Exemple:

code Je veux:

<wc:ParentControl id="objParent" runat="server" bla="etc"> 
<Content> <!-- This is an InnerProperty of the ParentControl --><DIV>bla bla bla bla.....<wc:SomeControl id="objSomeControl" runat="server" /><wc:3rdPartyControl id="obj3rdPartyControl" runat="server" /></DIV></Content> 
</wc:ParentControl> 

CodeBehind: objParentControl.Content.RenderControl (Writer)

Et les problèmes mentionnés ci-dessus commenceront. Comment s'assurer que pour tous les enfants dans le contenu on appellera OnPreRender?

code

qui fonctionne (mais la méthode RenderControl est juste inutile):

<wc:ParentControl id="objParentControl" runat="server"></wc:ParentControl> 
<wc:Content id="objContent" runat="server"><DIV>bla bla bla bla.....<wc:SomeControl id="objSomeControl" runat="server" /><wc:3rdPartyControl id="obj3rdPartyControl" runat="server" /></DIV></wc:Content> 

Ensuite, il suffit d'utiliser la RenderBeginTag et RenderEndTag du wc: contrôle de contenu. Ensuite, l'événement OnPreRender est appelé. Mais je ne voulais pas intégrer le contenu dans le contrôle parent en utilisant un InnerProperty. Ensuite, restituer manuellement les contrôles enfants par RenderControl ou RenderChildren.

Répondre

2

J'ai eu un problème similaire. Je ne suis pas sûr si c'est le même problème que vous rencontrez, mais le problème que j'avais était que j'avais un attribut ParseChildren(true) sur mon contrôle de conteneur. Étant donné que ParseChildren était true, les contrôles enfants seraient placés dans une propriété, plutôt que dans la collection de contrôles enfants du contrôle conteneur, et ne recevraient jamais leur fonction OnPreRender.

J'ai fini par remplacer la fonction CreateChildControls dans ma classe de contrôle contenant, où j'ai ajouté tout de ma collection analysée à la collection Controls. Parce que je surcharge la fonction Render de toute façon, je ne m'inquiète pas des contrôles dans la collection de contrôles rendus quand je ne voulais pas qu'ils soient.

Quelque chose comme ci-dessous:

[ParseChildren(true, "MyKids")] 
public class Example : Control { 

    private ArrayList _kids = new ArrayList(); 

    public ArrayList MyKids { 
     get { return _kids; } 
     set { _kids = value; } 
    } 

    protected override CreateChildControls() { 
     Controls.Clear(); 
     foreach(Control c in _kids) 
      Controls.Add(c); 
    } 

    protected override Render(HtmlTextWriter writer) { 
     ... 
    } 
} 
Questions connexes