ASP.NET:如何破坏动态添加的用户控件

时间:2009-11-03 21:08:49

标签: asp.net user-controls

我将用户控件添加到ID为phCustomFields的PlaceHolder。当我想删除phCustomFields中的用户控件时,我调用phCustomFields.Controls.Clear()。但是,执行此操作后,我的usercontrol的Page_Load方法仍然被命中(我通过在用户控件中放置一个断点来验证这一点。)为什么我的用户控件的page_load方法仍然被调用?我认为我的用户控件的实例在我调用Clear()方法后被删除并销毁。

更新

以下是一些演示我的问题的示例代码。通过在HelloWorld.ascx的Page_Load方法中设置断点并调试Page.aspx,调试过程将在HelloWorld.ascx中的Page_Load方法停止,这对我来说是期望的并且很好。但是,当我单击“删除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>

3 个答案:

答案 0 :(得分:1)

OnClick事件发生在Page Life循环中的Page_Load事件之后。在回发时,仍将调用用户控件Page_Load事件。如果稍后在父页面生命周期中放入Clear()命令,那应该会有所帮助。

编辑根据您的更新。每次都发生用户控件的Page_Load的原因是因为您有代码将该控件添加到.aspx页面的Page_Load事件中的页面。基本上,每次请求页面时,该用户控件都将被添加到页面中(并点击用户控件Page_Load事件)。

如果您希望在回发上发生/不发生某个操作,请使用页面的IsPostBack属性。不确定你想要对页面做什么,但希望这有点帮助。

答案 1 :(得分:0)

Clear()肯定会从控制树中删除控件,从而删除页面生命周期。在内部,它将对控件的引用设置为null。

这仍然可能发生的唯一方法是,如果该控件的另一个实例存在于控制树中的其他位置,或者您没有尽早调用Clear,或者没有在右侧调用它采集。在页面生命周期的什么时候你调用Clear()?

编辑:您在Clear evnet处理程序中调用了Remove_OnClick,该处理程序在Page_Load为所有控件触发后很长时间。在进入下一个事件之前,OnLoad将触发页面和所有控件。

答案 2 :(得分:0)

以下是webforms页面生命周期中的一些相关要点:

  1. 处理了网页加载事件
  2. 回发事件,包括处理的点击事件
  3. 处理页面预渲染事件
  4. 因此,您可以选择在Page_PreRender事件处理程序而不是Page_Load中执行控件中需要执行的任何处理。因为这在处理回发事件之后发生,所以如果控件已被移除则不会发生。