Сбой ASP.NET RenderControl или RenderChildren

Мне нужно использовать objChildControl.RenderControl или objControl.RenderChildren для ручной визуализации моих дочерних элементов управления. Но похоже, что эти методы неполны.

Все мои дочерние элементы управления используют событие OnPreRender для регистрации клиентских и клиентских таблиц стилей (поскольку они могут быть созданы только в событии prerender).

У меня есть две основные проблемы: передача текущего объекта System.Web.UI.Page в дочерний элемент управления и проверка запуска события OnPreRender для этих дочерних элементов управления.

Кажется, что я не могу использовать метод RenderControl на моих дочерних элементах управления, так как событие OnPreRender не будет вызываться. Однако я могу передать объект Page с помощью objChildControl.Page = Me.Page

Когда я использую RenderChildren, я не могу передать объект Page, или я могу? И я не уверен, что событие OnPreRender даже вызывается, когда я использую RenderChildren.

Некоторая помощь будет принята с благодарностью, так как я застрял;)

Обновить

Я нашел способ получить нужный мне результат, но это не то решение, которое мне нужно. Пример:

Код, который я хочу:

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

И тогда начнутся проблемы, упомянутые выше. Как убедиться, что для всех детей в Контенте будет вызываться OnPreRender?

Код, который работает (но тогда метод RenderControl просто бесполезен):

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

Затем просто используйте RenderBeginTag и RenderEndTag элемента управления wc:Content. Затем вызывается событие OnPreRender. Но я не хочу встраивать контент в родительский контроль с помощью InnerProperty. А затем вручную отрисовывать дочерние элементы управления с помощью RenderControl или RenderChildren.

1 ответ

У меня была похожая проблема. Я не уверен, что это та же самая проблема, с которой вы столкнулись, но проблема, с которой я столкнулся, заключалась в том, что ParseChildren(true) атрибут на моем контроле контейнера. Поскольку ParseChildren имеет значение true, дочерние элементы управления будут помещены в свойство, а не в коллекцию дочерних элементов управления содержащего элемента управления, и никогда не получат их OnPreRender функция называется.

Я закончил тем, что переопределил CreateChildControls функция в моем управляющем классе, где я добавил все из моей проанализированной коллекции в Controls коллекция. Потому что я переопределяю Render В любом случае, я не беспокоюсь о визуализации элементов управления в коллекции Controls, когда я не хотел, чтобы они были.

Что-то вроде ниже:

[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) {
        ...
    }
}
Другие вопросы по тегам