3 Stimmen

ASP.NET RenderControl oder RenderChildren schlagen fehl

Ich muss objChildControl.RenderControl oder objControl.RenderChildren verwenden, um meine untergeordneten Steuerelemente manuell zu rendern. Aber es sieht aus wie diese Methoden sind unvollständig.

Alle meine untergeordneten Steuerelemente verwenden das OnPreRender-Ereignis, um Clientscript und Client-Stylesheets zu registrieren (da diese nur im Prerender-Ereignis erstellt werden können).

Ich habe 2 Hauptprobleme, die Übergabe des aktuellen System.Web.UI.Page-Objekts an ein untergeordnetes Steuerelement und sicherstellen, dass das OnPreRender-Ereignis auf diese untergeordneten Steuerelemente ausgelöst wird.

Es scheint, dass ich die RenderControl-Methode nicht für meine untergeordneten Steuerelemente verwenden kann, da das OnPreRender-Ereignis nicht aufgerufen wird. Ich kann jedoch das Seitenobjekt mit objChildControl.Page = Me.Page übergeben

Wenn ich RenderChildren verwende, kann ich das Page-Objekt nicht übergeben, oder doch? Und ich bin nicht sicher, ob das OnPreRender-Ereignis überhaupt aufgerufen wird, wenn ich RenderChildren verwende.

Etwas Hilfe wäre sehr willkommen, da ich nicht weiterkomme ;)

Update

Ich habe einen Weg gefunden, das gewünschte Ergebnis zu erzielen, aber es ist nicht die Lösung, die ich mir wünsche. Beispiel:

Ich will den Code:

<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)

Und dann beginnen die oben genannten Probleme. Wie kann man sicherstellen, dass für alle untergeordneten Elemente innerhalb von Content der OnPreRender aufgerufen wird?

Code, der funktioniert (aber dann ist die RenderControl-Methode einfach nutzlos):

<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>

Dann verwenden Sie einfach den RenderBeginTag und den RenderEndTag des wc:Content Controls. Dann wird das OnPreRender Ereignis aufgerufen. Aber ich möchte den Inhalt in das Parentcontrol einbetten, indem ich eine InnerProperty verwende. Und dann manuell die Childcontrols mit RenderControl oder RenderChildren rendern.

2voto

mrdrbob Punkte 674

Ich hatte ein ähnliches Problem. Ich bin nicht sicher, ob es das gleiche Problem wie bei Ihnen ist, aber das Problem, das ich hatte, war, dass ich eine ParseChildren(true) Attribut auf meinem Container-Steuerelement. Da ParseChildren wahr war, würden die untergeordneten Steuerelemente in eine Eigenschaft und nicht in die Sammlung der untergeordneten Steuerelemente des enthaltenen Steuerelements eingefügt werden und würden niemals ihre OnPreRender Funktion aufgerufen.

Am Ende habe ich die CreateChildControls Funktion in meiner Steuerklasse, in der ich alles aus meiner geparsten Sammlung in die Controls Sammlung. Da ich die Render Funktion mache ich mir keine Sorgen darüber, dass die Steuerelemente in der Controls-Sammlung gerendert werden, wenn ich es nicht will.

Etwa wie unten:

[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) {
        ...
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X