3

子コントロールを手動でレンダリングするには、objChildControl.RenderControl または objControl.RenderChildren を使用する必要があります。しかし、これらの方法は不完全なようです。

すべての子コントロールは、OnPreRender イベントを使用して clientscript とクライアント スタイルシートを登録します (これらは prerender イベントでのみ作成できるため)。

現在の System.Web.UI.Page オブジェクトを子コントロールに渡し、これらの子コントロールで OnPreRender イベントが発生するようにするという 2 つの主な問題があります。

OnPreRender イベントが呼び出されないため、子コントロールで RenderControl メソッドを使用できないようです。ただし、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>

CodeBehind: objParentControl.Content.RenderControl(ライター)

そして、上記の問題が始まります。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 が 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) {
        ...
    }
}
于 2009-11-26T01:18:05.160 に答える