[英]Events are not working if UserControl.ascx are loaded through LoadControl(ctr)
我覺得這是一個有趣的小問題。 我認為原因在於頁面對象/事件生成的生命周期背后,但問題是我如何解決這個問題?
在 Default.aspx 中存在一些有趣的控件,但也有一個<asp:PlaceHolder runat="server" id="phUserContent"></asp:PlaceHolder>
此占位符在運行時為空。 在某些情況下,后面的代碼會將 UserControls 加載到其中。 像這樣Control ctr = LoadControl("~/UserControl/Note.ascx");
phUserContent.Controls.Add(ctr);
這個 Note.ascx 包含一些有趣的控件,最后是一個觸發事件的 LinkButton。 LinkButton 代碼非常簡單且語法正確,
<asp:LinkButton runat="server" ID="lbUpdate" OnClick="lbUpdate_Click" Text="Update"></asp:LinkButton>
在 ascx 背后的代碼中,我有事件的代碼,
protected void lbUpdate_Click(object sender, EventArgs e)
{... }
正如我所寫的,回發發生了,頁面像我懷疑的那樣重新生成 - 但沒有要執行的 lbUpdate_Click 事件。 當然嘗試了斷點。
我正在尋找兩種可能的情況。 一個是我錯過了一些非常容易的事情(你知道,比如在文件后面寫了錯誤的代碼)或者我錯過了頁面生成周期的重要部分。
我主要是進入第二個,像這樣(我只是想在這里..)
1. 頁面 (ascx) 得到了它的更改 2. 單擊了提交 3. Ascx 重新生成了 4. 事件已清除但存在並且沒有投射錯誤。 5.重新加載后,初始內容被重新加載
結果是編譯器看不到斷點,並且由於“執行空事件”而從未保存過值。 但這只是業余的猜測,請指教。
[根據答案更新]這就是我解決它的方法,基於下面接受的答案。
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. class 得到一個控制列表
2.在Page_PreInit(創建之前)添加UC(你可以在這里有X個)
3. 在 Page_Load(創建所有 ctr 的地方)中,將每個 UC 添加到 PH。
這也使得 UC 中的事件也有效,沒有魔法也沒有愚蠢的並發症:-)
這是一個生命周期問題。
請記住,每個頁面請求都會創建一個新頁面 object,以及其上所有控件的新實例。 如果您正在動態創建控件,則必須在每次回發時以完全相同的方式完成。 如果您希望新控件觸發事件,則它必須具有與舊控件相同的 id,並且在生命周期中處理控件事件之前將事件連接到它。
如果您在處理 ViewState 之后發生的頁面生命周期中的某個點動態創建控件,那么您還必須管理自己的 state。 換句話說,如果您沒有在 PreInit 階段動態創建控件,那么您將不得不手動處理恢復 state。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.