2009-11-20 29 views
3

我需要使用objChildControl.RenderControl或objControl.RenderChildren手動呈現我的子控件。但看起來這些方法並不完整。ASP.NET RenderControl或RenderChildren失敗

我的所有子控件都使用OnPreRender事件來註冊clientscript和客戶端樣式表(因爲這些只能在prerender事件中創建)。

我有2個主要問題,將當前的System.Web.UI.Page對象傳遞給子控件,並確保在這些子控件上觸發OnPreRender事件。

看來我不能在我的子控件上使用RenderControl方法,因爲OnPreRender事件不會被調用。 但我可以通過頁面對象objChildControl.Page = Me.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(作家)

然後上面提到的問題將開始。如何確保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的對RenderBeginTag和RenderEndTag:內容控制。 然後調用OnPreRender事件。 但我不想通過使用InnerProperty將內容嵌入到parentcontrol中。 然後通過RenderControl或RenderChildren手動渲染childcontrols。

回答

2

我有類似的問題。我不確定這是否與您遇到的問題相同,但我遇到的問題是我的容器控件上有一個ParseChildren(true)屬性。由於ParseChildren爲true,因此子控件將被放入屬性中,而不是放入包含控件的子控件集合中,並且永遠不會調用其調用的函數。

我最終覆蓋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) { 
     ... 
    } 
}