簡體   English   中英

如果通過 LoadControl(ctr) 加載 UserControl.ascx,則事件不起作用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM