2009-11-03 51 views
0

我將用戶控件添加到ID爲phCustomFields的PlaceHolder。當我想刪除phCustomFields中的用戶控件時,我調用phCustomFields.Controls.Clear()。但是,這樣做後,我的用戶控件的Page_Load方法仍然被打(我通過在用戶控件中放置一個斷點來驗證這一點)。爲什麼我的用戶控件的page_load方法仍然被調用?我認爲一旦我調用Clear()方法,我的用戶控件實例就被刪除並銷燬。ASP.NET:如何銷燬動態添加的用戶控件

更新

下面是一個說明我的問題的一些示例代碼。通過在HelloWorld.ascx的Page_Load方法中設置斷點並調試Page.aspx,調試過程將停止在HelloWorld.ascx中的Page_Load方法中,這是我所期待和罰款的。但是當我點擊「Remove HelloWorld.ascx」按鈕來刪除用戶控件,然後點擊「Do Nothing」按鈕來導致回發時,調試過程STILL停在HelloWorld.ascx的Page_Load方法中。但是,這不應該發生,因爲phTest中的Clear()方法被調用。

Page.aspx

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

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<script runat="server"> 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     Control C = LoadControl("HelloWorld.ascx"); 
     phTest.Controls.Add(C); 
    } 

    protected void Remove_OnClick(object sender, EventArgs e) 
    { 
     phTest.Controls.Clear(); 
    } 

</script> 

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

     <asp:Button Text="Does nothing" runat="server" /> 
     <asp:Button Text="Remove HelloWorld.ascx" OnClick="Remove_OnClick" runat="server" /> 
     <asp:PlaceHolder ID="phTest" Visible="false" runat="server"> 
     </asp:PlaceHolder> 
    </div> 
    </form> 
</body> 
</html> 

HelloWorld.ascx

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="HelloWorld.ascx.cs" Inherits="WebApplication1.HelloWorld" %> 
<script runat="server"> 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     int i = 0; 
    } 
</script> 

<b>Hello World</b> 
+0

你能告訴我們一些小代碼嗎? – AnthonyWJones 2009-11-03 21:21:06

回答

0

Clear()肯定從控制樹,因此頁面的生命週期中刪除控制。它在內部將對控件的引用設置爲null。

這仍然會發生的唯一方法是如果該控件的另一個實例居住在控制樹的其他位置,或者您沒有儘早打電話Clear,或者沒有在正確的集合上調用它。在頁面生命週期的哪個點你調用Clear()?

編輯:你在Remove_OnClick evnet處理程序,它是長期的Page_Load已解僱所有控件後調用Clear。在移動到下一個事件之前,OnLoad將觸發頁面和所有控件。

+0

我已更新我的問題回答你的問題。我在Page_Load上調用Clear()。 – burnt1ce 2009-11-03 21:36:45

+0

@ burnt1ce看到我的更新。 – 2009-11-03 21:40:59

+0

OOPPSSSIEs 謝謝 – burnt1ce 2009-11-03 22:03:08

1

OnClick事件發生在頁生命週期中的Page_Load事件之後。在回發中,用戶控件Page_Load事件仍將被調用。如果你稍後在父頁生命週期中使用Clear()命令,那應該有所幫助。

編輯根據您的更新。每次都發生用戶控件的Page_Load的原因是因爲您有代碼將該控件添加到.aspx頁面的Page_Load事件中的頁面。基本上,每次請求頁面時,該用戶控件將被添加到該頁面(並擊中用戶控件Page_Load事件)。

如果您希望某個操作發生/不發生在回發中,請使用頁面的IsPostBack屬性。不確定你想要做什麼,但希望這有助於一點點。

+0

OH傻我。我創建了這樣一個愚蠢的例子,我忘了在添加用戶控件的代碼周圍添加if(!IsPostback)條件 – burnt1ce 2009-11-03 23:51:09

0

下面是來自web表單頁面生命週期的一些相關亮點:

  1. 頁面加載事件處理
  2. 回發事件,包括點擊事件處理
  3. 頁面預渲染事件處理

因此,您可以選擇執行您在Page_PreRender事件處理程序中的控件中執行的任何處理,而不是Page_Load。當處理回發事件後發生這種情況時,如果控件已被刪除,則不會發生這種情況。