2012-05-09 77 views
1

我正在使用甲ChildClass用戶控制具有父類的鏈覆蓋的Page_Load,最終從繼承System.Web.UI.UserControl控制不能在層次結構

public BasestClass : AnotherClassExtendingUserControl 
{ 
    private void Page_Load(object sender, EventArgs e) 
    { 
     // do some stuff 
    } 
} 

public BaseClass : BasestClass 
{ 
    // no Page_Load 
} 

兩個父類環比上漲,Page_Load中被標記私人。 「中間」類顯然不會覆蓋它,但我需要在用戶控件的Page_Load中添加一些內容。

public ChildClass : BaseClass 
{ 
    // think I need to override Page_Load here, 
    // but there is no acceptable method to override 
} 

我能做些什麼來進入ChildClass的Page_Load中?該控件中有一些控件需要操作,它們不存在於BaseClassBasestClass中。

回答

1

在執行OnLoad事件方法期間,Page_Load(或Load)事件被觸發,所以我建議在那裏移動你的邏輯。您應該沒有問題覆蓋子級的OnLoad方法。

+0

不完全正確。 'Page_Load'不是一個事件,它是'Load'事件的默認事件處理程序。我認爲同時使用OnLoad和Page_Load的重寫可能會導致混淆,特別是當一個類從ChildClass繼承而來時。事件處理程序默認情況下是自動連接的,而每次您重寫'OnLoad'時,必須明確調用'base.OnLoad(e)'。這只是我的2美分。 – mafue

+0

@mafue:'OnLoad'是引發'Load'事件的頁面方法。在這種情況下,正確的方法是重寫事件提取器,而不是事件處理程序。在這裏看到更多的細節:http://msdn.microsoft.com/en-us/library/ms178472.aspx –

+0

@mafue:另請參閱我的答案在這裏:http://stackoverflow.com/questions/7664969/aspnet -page-life-cycle-methods-vs-events –

1

我複製你的類,只是改變了兩件事情:

BasestClass : System.Web.UI.UserControl 

這不應該改變任何東西,因爲你說BasestClass最終從UserControl繼承。

我還添加了這BasestClass.Page_Load:

Response.Write("BasePage_Load"); 

現在,解決你的問題:

您可以添加構造以ChildClass並添加事件處理程序Load事件。

public ChildClass() 
{ 
     Load += new EventHandler(_Default_Load); 
} 

void _Default_Load(object sender, EventArgs e) 
{ 
     Response.Write("Event Handler"); 
} 

您也可以重寫的OnPreRender:

protected override void OnPreRender(EventArgs e) 
{ 
     base.OnPreRender(e); 
     Response.Write("OnPreRender"); 
} 

做上述所有的,這是在響應輸出:

Event Handler 
BasePage_Load 
OnPreRender 

如果你想確保Page_Load方法BasestClass已經運行在您的新代碼之前,OnPreRender是您做事情的地方。