2009-04-27 5 views
6

UserControlをMultiViewコントロール内のビューに動的に読み込みます。 UserControlはイベントハンドラを追加しますが、イベントは発生しません。UserControlのイベントハンドラが起動しない

私はここで何が欠けていますか? ありがとう!

含むASPXページ:

protected override void OnPreRender(EventArgs e) 
{ 
    if (MultiView1.ActiveViewIndex == 2) //If the tab is selected, load control 
    { 
     Control Presenter = LoadControl("Presenter.ascx"); 
     (MultiView1.ActiveViewIndex.Views[2].Controls.Add(Presenter); 
    } 
    base.OnPreRender(e); 
} 

Presenter.ascx.cs

override protected void OnInit(EventArgs e) 
{ 
    Retry.Click += this.Retry_Click; //This is a .Net 2.0 project 
    base.OnInit(e); 
} 


protected void Retry_Click(object sender, EventArgs e) 
{ 
    //This never fires 
} 

答えて

8

ページのプレレンダーイベントでコントロールを読み込んでいるため、発生していないと考えています。ポストバック時に、ビューの状態がないため、コントロールが失われています。したがって、イベントを発生させるコントロールはありません。ページのinitイベントでコントロールを読み込もうとします。何が起こるか教えてください!

+0

それはそれでした。どうも! OnPreInitでMultiView1.ActiveViewIndexが設定されていないため、Ifステートメントも削除する必要がありました。 –

+0

ようこそ。 –

+0

ありがとうございました! –

1

それは私が取るだろう、それぞれがポストバック後にコントロールが追加されていないように聞こえますもしaspxのページを含む文が問題を修正するかどうかを確認するには... im Retryがボタンであると仮定しますか?

+0

私は既にIf文を削除しようとしましたが、違いはありません。 はい、再試行はボタンです。 –

6

レンダリング前にポストバックイベントの処理が行われるため、コントロールがページ内に存在しません。

ライフサイクルイベント

がこの順で焼成されている(スキップ数):

  1. 初期
  2. ロード
  3. のPreRender
  4. アン

とイベント処理が間に行われますLoadとPreRender(一部のイベントがページをレンダリングする方法を変更する場合は意味があります)。

したがって、再試行コントロールをロードまたは初期化するコードを移動してください。

参考:Asp.Net Page Life Cycle Overview

2

制御は、OnPreRenderイベントで入力できるようにするために最初に表示されている必要があります。 しかし、あなたはそれが目に見えないようにしたいかもしれません。 必ずお持ちくださいEnableViewState = false;

関連する問題