2010-02-25 75 views
1

請原諒的僞代碼,但它是一個簡單的問題:ASP.NET事件生命週期繼承用戶控件

我創建了一個用戶控件(myControlBase:用戶控件),在一個文本框(ID =「txtbox」)這是標記。在代碼隱藏中,我編寫了一個方法SayHello(string s){txtbox.Text = s; }。

我創建了另一個擴展myControlBase(myControl:myControlBase)的用戶控件。在這個子控件的page_load中,我打電話給SayHello(「hello」);並收到一個運行時錯誤,告訴我txtbox是空的(它還沒有創建,但顯然)。

那麼,我可以從用戶控件繼承並讓我的子控件訪問基本控件的標記嗎?我已經嘗試瞭解這些控件的事件生命週期,但我想我沒有得到它。

任何想法?

-edit-

對不起,它是ASP.Net。如果這段代碼使得它更清晰,那麼我在描述這個問題方面做得相當糟糕。

txtBox是一個ASP:存在於myControlBase標記中的文本框控件。

public partial class myControlBase : System.Web.UI.UserControl 
{ 
    protected void SayHello(string s){ 
    txtBox.Text = s; 
    } 
} 

public partial class myControl: myControlBase 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     SayHello("hello"); 
    } 
} 

這會在SayHello(「你好」)失敗;因爲txtBox返回Null。

+0

我假設你在談論ASP.Net – SLaks 2010-02-25 21:32:33

+0

你會發布你的代碼嗎? – Vlad 2010-02-25 21:34:28

+0

哦。對不起,ASP不是我的能力。 – Vlad 2010-02-25 23:06:06

回答

2

我現在明白這個問題,但我沒有一個很好的解決方案。

當您像這樣擴展用戶控件時,您完全失去對基本控件標記的訪問權限。孩子的Page_Load之前被調用(可能代替?)基本控件的Page_Load。

0

它看起來像CreateChildControls還沒有被調用。

嘗試在Page_Load中添加EnsureChildControls(),或者從OnPreRender事件調用SayHello。

+0

這些建議似乎都沒有幫助。 =/ – caltrop 2010-03-01 20:58:37

1

除了像Page_Load這樣的方法,還有On*方法,如OnInitOnLoad。這些都是虛擬方法,因此可以由派生用戶控件覆蓋。

public override void OnLoad(EventArgs e) 
{ 
    base.OnLoad(e); 
    SayHello("hello"); 
} 
+0

你是對的,但是這仍然沒有解決基本控件的標記不能通過子控件訪問的問題。好點,OnLoad會是一個更好的選擇。 – caltrop 2010-03-01 21:39:21

+0

再次告訴我們您爲什麼期望標記可訪問? – 2010-03-01 21:46:42

+1

那麼,如果你正在擴展一個用戶控件,那麼訪問控件的標記將會很好。例如,如果在基本用戶控件中有一個文本框,則可能需要它的子類來根據上面的代碼更改該文本框。 – caltrop 2010-03-01 22:23:02