3

我需要使用 objChildControl.RenderControl 或 objControl.RenderChildren 来手动渲染我的子控件。但看起来这些方法是不完整的。

我所有的子控件都使用 OnPreRender 事件来注册客户端脚本和客户端样式表(因为这些只能在 prerender 事件中创建)。

我有 2 个主要问题,将当前 System.Web.UI.Page 对象传递给子控件并确保在这些子控件上触发 OnPreRender 事件。

似乎我不能在我的子控件上使用 RenderControl 方法,因为不会调用 OnPreRender 事件。但是,我可以通过 objChildControl.Page = Me.Page 传递 Page 对象

当我使用 RenderChildren 时,我无法传递 Page 对象,或者可以吗?而且我不确定当我使用 RenderChildren 时是否调用了 OnPreRender 事件。

一些帮助将不胜感激,因为我被卡住了;)

更新

我找到了一种获得所需结果的方法,但这不是我想要的解决方案。例子:

我想要的代码:

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

代码隐藏:objParentControl.Content.RenderControl(Writer)

然后上面提到的问题就开始了。如何确保将为 Content 中的所有子项调用 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>

然后只需使用 wc:Content 控件的 RenderBeginTag 和 RenderEndTag。然后调用 OnPreRender 事件。但我不想通过使用 InnerProperty 将内容嵌入到父控件中。然后通过 RenderControl 或 RenderChildren 手动渲染子控件。

4

1 回答 1

2

我有一个类似的问题。我不确定您遇到的问题是否相同,但我遇到的问题是ParseChildren(true)我的容器控件上有一个属性。因为 ParseChildren 为真,子控件将被放入一个属性中,而不是放入包含控件的子控件集合中,并且永远不会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) {
        ...
    }
}
于 2009-11-26T01:18:05.160 回答