【问题标题】:Why dynamically created user controls disappear when controls are not doing full postbacks?为什么当控件没有进行完整的回发时动态创建的用户控件会消失?
【发布时间】:2012-05-03 15:17:54
【问题描述】:

根据我目前的理解,当您拥有 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();
    }

关于为什么控件消失的任何想法,即使不应该触发回发?

【问题讨论】:

    标签: c# asp.net user-controls updatepanel


    【解决方案1】:

    根据我目前的理解,当你有一个 UpdatePanel 控制没有完整的回发。

    从 UpdatePanel 触发的回发始终执行整个页面的生命周期。所有事件都正常触发。是否使用 UpdatePanel 没有区别。每次以编程方式添加控件时,您都需要在每次回发时重新添加它。

    Read this post,它可以帮助你更好地理解这里发生了什么。

    【讨论】:

      【解决方案2】:

      Page Life Cycle 结束时,Runtime/Compile Time 生成的所有控件都将是 Disposed

      以下是页面事件。请在每个 Event 上设置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 才会注册。我的建议是保留一个动态添加的列表,并将其存储在会话变量中

      【讨论】:

        猜你喜欢
        • 2017-08-16
        • 1970-01-01
        • 2018-09-28
        • 1970-01-01
        • 2013-03-11
        • 2016-06-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多