2011-07-07 25 views
0

我覺得這是一個有趣的小問題。我認爲原因在於頁面對象/事件生成的生命週期背後,但問題是我如何解決這個問題?如果UserControl.ascx通過LoadControl(ctr)加載,事件不起作用

Default.aspx中存在着一些有趣的控制還包括
<asp:PlaceHolder runat="server" id="phUserContent"></asp:PlaceHolder>

此佔位符是空的,直到運行時。在某些情況下,後面的代碼會將UserControl加載到其中。像這樣
Control ctr = LoadControl("~/UserControl/Note.ascx"); phUserContent.Controls.Add(ctr);

這Note.ascx包含了一些有趣的控件和最後一個觸發事件一個LinkBut​​ton。 LinkBut​​ton的代碼是非常容易和gramatically正確,
<asp:LinkButton runat="server" ID="lbUpdate" OnClick="lbUpdate_Click" Text="Update"></asp:LinkButton>

後面的代碼爲ASCX我對事件的代碼,

protected void lbUpdate_Click(object sender, EventArgs e)
{ ... }

正如我wroted中,回發發生時,頁面會重新生成,因爲我懷疑 - 但沒有執行lbUpdate_Click事件。當然,嘗試一個斷點。

我正在尋找兩種可能的情況。一個是我錯過了一些非常簡單的事情(你知道,就像文件背後的錯誤代碼一樣)或者我錯過了頁面生成周期的一個重要部分。

我主要是到第二個,像這樣(我只是想在這裏..)
1頁(ASCX)得到它的變化 2.提交被點擊 3. ASCX重新生成 4。事件已被清除,但存在並沒有投射錯誤。 5.重新加載後,初始內容被重新加載

其效果是編譯器無法看到斷點,並且由於「執行空事件」而從未保存過值。但這只是一個業餘愛好者的猜測,請大家指教。

[UPDATE AS PER ANSWER] 這就是我如何解決它,根據下面的答案答案。

List<Control> ctr; 
public User() 
{ 
    ctr = new List<Control>(); 
} 
protected void Page_PreInit(object sender, EventArgs e) 
{ 
    ctr.Add(LoadControl("~/UserControl/Note.ascx")); 
} 

protected void Page_Load(object sender, EventArgs e) 
{ 
    ctr.ForEach(d => phUserContent.Controls.Add(d)); 
} 

不久..
1.全班起立控制列表
2.在Page_PreInit(創建之前)添加UC(u能在這裏他們的X)
3.在Page_Load中(其中所有的ctr被創建)將每個UC添加到PH。

這也使得在UC的事件也在努力,沒有魔法,沒有愚蠢的併發症:-)

回答

2

這是一個生命週期的問題。請記住,每個頁面請求都會創建一個新的頁面對象和新的其中所有控件的實例。如果您是動態創建控件,那麼在每次回發時都必須以完全相同的方式完成。如果您希望新控件觸發事件,那麼它必須具有與舊事件相同的ID,並且在生命週期中處理控件事件之前將事件掛接到該事件。

如果您在處理ViewState後發生的頁面生命週期中的某個點動態創建控件,那麼您還必須管理自己的狀態。換句話說,如果您在PreInit階段沒有動態創建控件,那麼您將不得不手動處理恢復狀態。

+0

感謝您的評論。我真的必須想一點,才能在你的文本中找到我的問題。儘管如此,您可以更輕鬆地將解決方案與您的描述聯繫起來。並找到它。我會用答案更新我的Q. – Independent

相關問題