2009-11-03 91 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。当处理回发事件后发生这种情况时,如果控件已被删除,则不会发生这种情况。