2009-04-27 57 views
6

我動態地將UserControl加載到MultiView控件中的View中。雖然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

我想這不是因爲你正在加載頁面的prerender事件控件。回發後,控件正在丟失,因爲它沒有視圖狀態。因此無法控制其事件發生。嘗試在頁面的init事件中加載控件。讓我們知道發生了什麼!

+0

就是這樣。謝謝! 我不得不刪除If語句,因爲在OnPreInit中,MultiView1.ActiveViewIndex未設置。 – 2009-04-27 14:32:47

1

這聽起來像沒有被添加控件後每回來後,我會拿出如果聲明在包含aspx頁面,看看是否解決了這個問題...即時假設重試是一個按鈕?

+0

我已經嘗試刪除If語句 - 沒有區別。 是的,重試是一個按鈕。 – 2009-04-27 14:20:24

6

回傳事件處理在呈現之前完成,因此控件在您的案例中不存在於頁面中。

生命週期事件在這個順序點火(跳過幾個):

  1. 初始化
  2. 負載
  3. 的PreRender
  4. 卸載

和事件處理之間進行Load和PreRender(如果某些事件改變了頁面的呈現方式,這很有意義)。

所以,只需將加載Retry控件的代碼移動到Load或Init。

參考:Asp.Net Page Life Cycle Overview

2

控制必須是可見的最初能在事件的OnPreRender進入。 但也許你希望它是不可見的。 一定要有EnableViewState = false;

相關問題