¿Por qué los controles de usuario creados dinámicamente desaparecen cuando los controles no realizan devoluciones de datos completas?

Según mi comprensión actual, cuando tiene un control UpdatePanel no hay una devolución de datos completa. Por lo tanto, si agrego dinámicamente controles de usuario personalizados y tienen UpdatePanels que se actualizan en su código, no deberían desaparecer de la página en la que están cargados, ¿verdad? Aparentemente no. Hice un proyecto simple para probar y aún así mis controles dinámicos desaparecen cuando se hace clic, aunque no deberían activar una devolución de datos completa. Tengo una página aspx que carga los controles:

<%@ 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>

Con el siguiente código detrás:

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);

    }

Y un simple control de usuario:

<%@ 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>

Con el siguiente código detrás:

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

¿Alguna idea sobre por qué los controles están desapareciendo a pesar de que no debería haber una activación de devolución de datos?

preguntado el 03 de mayo de 12 a las 16:05

2 Respuestas

De acuerdo, según mi comprensión actual, cuando tiene un control UpdatePanel, no hay una devolución de datos completa.

Las devoluciones de datos activadas desde UpdatePanels siempre ejecutan el ciclo de vida completo de la página. Todos los eventos se desencadenan normalmente. No importa si usa un UpdatePanel o no. Cada vez que agrega un control programáticamente, debe volver a agregarlo en cada devolución de datos.

Leer este post, puede ayudarte a entender un poco mejor lo que está pasando aquí.

contestado el 03 de mayo de 12 a las 16:05

Al final de la Ciclo de vida de la página todos los controles generados en Runtime/Compile Time se mostrarán Disposed.

A continuación se muestran los eventos de la página. Por favor, establezca el BreakPoint en cada Evento y puedes averiguar que en cada Asynchronous/Synchronous Request, todos estos Page Events se están ejecutando.

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);
}

Debe completarlos en cada Page Init event para persistir Viewstate, también los eventos para los controles agregados dentro de un panel de actualización durante los clics en los botones no parecen registrarse hasta el siguiente Postback. Mi sugerencia es mantener una lista de lo que ha agregado dinámicamente y almacenarlo en una variable de sesión

respondido 04 nov., 15:17

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.