2011-08-11 61 views
3

我有一個自定義的ASP.NET控件。在它的初始化處理我添加一個委託到頁面的Init這樣的:ASP.NET:Page.Init woudln't fire

protected override void OnInit(EventArgs e) 
{ 
    base.OnInit(e); 
    if(someCondition()) 
    { 
      this.Page.Init += delegate(object sender, EventArgs ee) 
      { 
       //some stuff 
      }; 
    } 
} 

現在,如果我加入這個自定義控制頁面的HTML聲明,每一件事工作正常,在頁面的Init代表被調用。但是,如果我這個編程控件添加到頁面中,如:

protected override void OnLoad(EventArgs e) 
{ 
    base.OnLoad(e); 
    MyControl myControl = new MyControl { ID = "myControl" }; 
    this.Page.Form.Controls.Add(myControl); 
} 

初始化,如果我連接到Page.Init控制獲取的調用,但該委託沒有。我在這裏做錯了什麼?

+0

您可能會考慮使用ASP.NET的「ASP:Panel」控件,然後通過根據需要切換其「Visible」屬性來隱藏/顯示控件。 –

+1

我不喜歡在頁面上添加額外的控件只是爲了處理其他控件的可見性 – Kizz

回答

2

將您的自定義控件的聲明移至頁面的OnInit而不是OnLoad。在調用base.OnInit(e)之前,實例化控件並將其添加到窗體。這將使頁面有機會加載您的控件,並在ASP.NET運行時調用Init之前實際將您的代理附加到頁面的Init事件。你的問題是當你的控件的Init被執行時,頁面的Init已經被調用。

+0

謝謝,在調用頁面的base.OnInit之前啓動控件 - 這正是我所缺少的。 – Kizz

3

這是因爲在的OnLoad添加控件時,頁面的Init已經執行

1

而是在pageLoad的加控制,將其添加在Page_PreInit事件處理程序。

+0

PreInit上還沒有表單 – Kizz