2012-05-03 27 views
2

基於我目前的理解,當你有一個UpdatePanel控件時,沒有完整的回發。因此,如果我動態地添加自定義用戶控件,並且它們的UpdatePanel在代碼中更新,它們不應該從它們加載到的頁面中消失,對吧?顯然不是。我做了一個簡單的項目來測試,即使它們不應該觸發完整的回發,我的動態控件仍然會在點擊時消失。我有一個加載控件一個aspx頁面:爲什麼動態創建的用戶控件在控件沒有完成回發時消失?

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="TESTmultipleScriptManagerControls.aspx.cs" Inherits="myPlayground.TESTmultipleScriptManagerControls" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
<title></title> 
</head> 
<body> 
<form id="form1" runat="server"> 
<div> 

    <asp:ScriptManager ID="ScriptManager1" runat="server"> 
    </asp:ScriptManager> 

    <asp:UpdatePanel ID="UpdatePanel1" runat="server"> 
    <ContentTemplate> 
    <asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" /> 

    <asp:PlaceHolder ID="PlaceHolder1" runat="server"></asp:PlaceHolder> 
    </ContentTemplate> 
    </asp:UpdatePanel> 

</div> 
</form> 
</body> 
</html> 

用下面的代碼背後:

protected void Button1_Click(object sender, EventArgs e) 
    { 

     TESTcontrol1 temp = LoadControl("TESTcontrol1.ascx") as TESTcontrol1; 
     PlaceHolder1.Controls.Add(temp); 
     TESTcontrol1 temp2 = LoadControl("TESTcontrol1.ascx") as TESTcontrol1; 
     PlaceHolder1.Controls.Add(temp2); 

    } 

和簡單的用戶控件:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="TESTcontrol1.ascx.cs" Inherits="myPlayground.TESTcontrol1" %> 
<asp:ScriptManagerProxy ID="ScriptManagerProxy1" runat="server"> 
</asp:ScriptManagerProxy> 
<asp:UpdatePanel ID="UpdatePanel1" runat="server"> 

<ContentTemplate> 
<asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" /> 
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label> 
</ContentTemplate> 
</asp:UpdatePanel> 

隨着後面的下面的代碼:

protected void Button1_Click(object sender, EventArgs e) 
    { 
     Label1.Text = System.DateTime.Now.ToString(); 
    } 

關於wh的任何建議即使不應該有回發觸發,控件也會消失嗎?

回答

3

OK,當你有一個UpdatePanel 控制沒有完全回發。

從UpdatePanels觸發的回傳總是執行整個頁面的生命週期。所有的事件都會正常觸發。無論您是否使用UpdatePanel,它都沒有區別。每次以編程方式添加控件時,都需要在每次回發時重新添加它。

Read this post,它可以幫助你更好地理解這裏發生了什麼。

3

通過在Runtime/Compile Time產生的Page Life Cycle所有控件的結束將Disposed

以下是頁面事件。請在每個事件上設置BreakPoint,並且您可以計算出每個Asynchronous/Synchronous Request上所有這些Page Events正在執行中。

protected override void OnInit(EventArgs e) 
{ 
    base.OnInit(e); 
} 

protected override void OnPreInit(EventArgs e) 
{ 
    base.OnPreInit(e); 
} 

protected override void OnPreLoad(EventArgs e) 
{ 
    base.OnPreLoad(e); 
} 
protected void Page_Load(object sender, EventArgs e) 
{ 

} 
protected override void OnLoadComplete(EventArgs e) 
{ 
    base.OnLoadComplete(e); 
} 

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

protected override void Render(HtmlTextWriter writer) 
{ 
    base.Render(writer); 
} 

protected override void OnUnload(EventArgs e) 
{ 
    base.OnUnload(e); 
} 

您需要填充他們在每個Page Init event爲了堅持Viewstate,也爲中點擊按鈕更新面板裏面添加控件的事件不似是結婚登記,直到下一個Postback。我的建議是讓你有動態添加什麼樣的列表,並將其存儲在一個會話變量根據我目前的理解

相關問題