trigger - Agregar controles dinĂ¡micamente a un UpdatePanel en ASP.NET AJAX
trigger en updatepanel (2)
Tengo el siguiente código realmente simple
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:PlaceHolder ID="PlaceHolder1" runat="server">
</asp:PlaceHolder>
<asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" />
</ContentTemplate>
</asp:UpdatePanel>
Y el código detrás
protected void Button1_Click(object sender, EventArgs e)
{
Literal literal = new Literal();
literal.Text = DateTime.Now.ToString();
literal.ID = DateTime.Now.Ticks.ToString();
// These both work fine the first time the button is clicked
// but the second time nothing is added.
UpdatePanel1.ContentTemplateContainer.Controls.Add(literal);
PlaceHolder1.Controls.Add(literal);
}
Mi problema es que el control Literal solo se agrega una vez. Recorrí sitios de blogs y de google (más libros) pero sin suerte. ¿Qué me estoy perdiendo?
En asp.net, los controles en el archivo ASPX se generan automáticamente en cada devolución. Los controles que ha creado no están en el código ASPX, por lo que el marco no los crea para usted. La primera vez que ejecuta el método Button1_Click, agrega un control adicional a la página. La segunda vez que ejecutas el método Button1_Click, estás en otra publicación y ese primer botón extra se ha olvidado. Entonces, el resultado de esa devolución de datos es que obtienes un botón extra otra vez.
Esto creará un control adicional cada vez que haga clic en el botón (aunque las marcas de tiempo se actualizarán cada vez que presione el botón porque los controles se están recreando)
protected void Button1_Click(object sender, EventArgs e)
{
int count = 0;
if (ViewState["ButtonCount"] != null)
{
count = (int)ViewState["ButtonCount"];
}
count++;
ViewState["ButtonCount"] = count;
for (int i = 0; i < count; i++)
{
Literal literal = new Literal();
literal.Text = DateTime.Now.ToString();
literal.ID = DateTime.Now.Ticks.ToString();
UpdatePanel1.ContentTemplateContainer.Controls.Add(literal);
PlaceHolder1.Controls.Add(literal);
}
}
Estoy de acuerdo con la respuesta anterior. Sin embargo, este enfoque no salvará el estado de los controles dinámicos (o para ser exactos, salvará el estado pero no los cargará de nuevo). El estado de vista de carga se llama en la sección Cargar evento del ciclo de vida de la página, donde asigna los valores de control guardados en el estado de visualización. Sin embargo, si los controles no se crean en este momento, no se pueden cargar con datos anteriores, por lo que para mantener el estado, los nuevos controles se deben volver a crear en o antes del evento de carga.
protected void Page_Load(object sender, EventArgs e)
{
//PS: Below approach saves state as id is constant, it simply generates a new control with same id hence viewstate loads the value
if (IsPostBack)
{
int count = 0;
if (ViewState["ButtonCount"] != null)
{
count = (int)ViewState["ButtonCount"];
}
count++;
ViewState["ButtonCount"] = count;
for (int i = 0; i < count; i++)
{
TextBox literal = new TextBox();
//literal.Text = DateTime.Now.ToString();
literal.ID = "Textbox" + i.ToString();
//UpdatePanel1.ContentTemplateContainer.Controls.Add(literal);
PlaceHolder1.Controls.Add(literal);
}
}
}
Adición dinámica de controles Ver estado y devolución de datos