1

Controlクラス(Standard)から動的にロードされる別のユーザーコントロール(Header)内にネストされたユーザーコントロール(Navigation)があります。

ユーザーコントロール、ナビゲーションおよびヘッダーにはAutoEventWireup=falseがあります。

コントロールクラスのStandard呼び出しは、構成アイテムからヘッダーユーザーコントロールをロードします。

private void layoutAndRender(HtmlTextWriter output, string UserControlKey, NameValueCollection UserControlsConfiguration)
{
    if(UserControlsConfiguration[UserControlKey] != null && UserControlsConfiguration[UserControlKey].ToString() != "")
    {
        string suc = System.Web.HttpContext.Current.Request.ApplicationPath + UserControlsConfiguration[UserControlKey].ToString();
        UserControl ucToRender = (UserControl)this.Page.LoadControl(suc);
        ucToRender.RenderControl(output);
    }
}

私の問題は、Page.RequestとPage.Responseを受け入れることができるNavigationユーザーコントロールのオブジェクトを初期化したいのですが、Navigationコードビハインドでイベントが発生していないようです。

オブジェクトを初期化するために使用しているコードは次のとおりです。

this.browser = new Browser(this.Request, this.Response);

Navigationコンストラクターでこれを実行しようとしましたが、this.Requestとthis.Responseがその時点で設定されていません。

メソッドでステートメントを使用しようとしましたが、Navigationコンストラクターを使用しvoid Page_Load(object sender, System.EventArgs e)ていても、これは起動していないようです。this.Load += new System.EventHandler(this.Page_Load);

Page_InitとPage_PreRenderについても同様のステートメントを試しましたが、いずれも起動していないようです。

LoadControlがロードされたコントロールは、ロードした方法でロードされた場合、LoadイベントまたはInitイベントを発生させません。同じことが、含まれている可能性のあるすべてのユーザーコントロールにも当てはまりますか?

4

2 に答える 2

1

ロードするコントロールに対してAutoEventWireupが設定されている場合は、メソッドをオーバーライドして、コントロールのイベント ハンドラーを関連付ける必要があります。およびプロパティは、 内から使用できる必要があります。falseOnInitLoadRequestResponsePage_Load

例えば:

public class Header : Control
{
    private void Page_Load(object sender, EventArgs e)
    {
    }

    override protected void OnInit(EventArgs e)
    {
        this.Load += new System.EventHandler(this.Page_Load);
    }   
}

詳細については、MSDN を参照してくださいAutoEventWireup: http://support.microsoft.com/kb/324151

于 2013-01-17T04:46:33.717 に答える
0

残念ながら、これはレガシー コードであり、常に正しい方法で行われるとは限りません。

特に、ユーザー コントロールは手動で読み込まれ、レンダリングされるため、私が利用したかったイベント モデルのほとんどがスキップされる可能性があります。理想的には、コントロールを HtmlTextWriter にレンダリングするのではなく、ページに対して AddControl() を実行する必要があります。

私の回避策は、RenderControl メソッドをオーバーライドし、RenderControlbrowserをチェーンに渡す前にプロパティを初期化することです。

于 2013-01-17T04:56:42.900 に答える