Principales respuestas
Controles dinamicos desaparecen al hacer postback y no funciona los eventos

Pregunta
-
Hola a todos Tengo un problema en un web form donde quiero poner varios controles de forma dinámica cuando le paso a una funcion un parametro en donde le dice cuantos botones tiene que cargarse. Cuando de carga le doy a cualquier boton cargado y entonces al darle click no ejecuta el evento y desaparecen los botones.
Aquí les envio un poco de codigo
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using WebApplication1.Clases; using System.Data.SqlClient; using System.Data; namespace WebApplication1 { public partial class WebForm1 : System.Web.UI.Page { protected Test obTest = new Test(); protected DataTable tbTstAd, tbPregunta; protected int indice; protected Button[] btn = new Button[31];// protected string test_Selecionado; protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { tbTstAd = new DataTable(); tbPregunta = new DataTable(); tbTstAd = obTest.mostrar_test_Admi(); foreach (DataRow i in tbTstAd.Rows) { ddlSelTest.Items.Add(i["cTsCdg"].ToString()); } } } protected void mostrar_panel_pregunt02(string test)////Listado del todo el test { Panel[] p = new Panel[31]; DataTable tb = new DataTable(); tb = tbPregunta = obTest.mostrar_test_Pregunta(test); int nPre = obTest.numero_de_preguntas(test); for (int i = 0; i <= 30; i++) { p[i] = new Panel(); } RadioButtonList[] rbld = new RadioButtonList[31]; Label[] lbld = new Label[31]; Image[] imgd = new Image[31]; for (int i = 0; i <= 30; i++) { lbld[i] = new Label(); rbld[i] = new RadioButtonList(); imgd[i] = new Image(); } for (int i = 0; i <= nPre; i++) { lbld[i].Text = tb.Rows[i]["Pregunta"].ToString(); rbld[i].Items.Add(tb.Rows[i]["Rsp1"].ToString()); rbld[i].Items.Add(tb.Rows[i]["Rsp2"].ToString()); rbld[i].Items.Add(tb.Rows[i]["Rsp3"].ToString()); imgd[i].ImageUrl = tb.Rows[i]["Img"].ToString(); /////añadir todo esto al panel p[i].Controls.Add(lbld[i]); p[i].Controls.Add(rbld[i]); p[i].Controls.Add(imgd[i]); panel_preguntas_cuerpo.Controls.Add(p[i]); } } protected void mostrar_preguntas_con_botones(string test)///Muestra las preguntas de cada test { DataTable tb = new DataTable(); tb = obTest.mostrar_test_Pregunta(test); int num_pre = obTest.numero_de_preguntas(test); for (int i = 1; i <= num_pre; i++) { btn[i] = new Button(); btn[i].ID = "btnPregunta" + i.ToString(); btn[i].Text = "Pregunta" + i.ToString(); btn[i].Click += new EventHandler(btn_Click);//////prueba Panel_preguntas.Controls.Add(btn[i]); } } protected void btn_Click(object sender, EventArgs e) { Response.Write("<script>alert('Prueba')</script>"); } protected void ddlSelTest_SelectedIndexChanged(object sender, EventArgs e) { test_Selecionado = ddlSelTest.SelectedValue; tbPregunta = obTest.mostrar_test_Pregunta(test_Selecionado); indice = ddlSelTest.SelectedIndex; string ModoTestPresentacion; ModoTestPresentacion = rblTpPreguntaTest.SelectedValue; switch (ModoTestPresentacion) { case "Listado": mostrar_panel_pregunt02(test_Selecionado); break; case "Pregunta": mostrar_preguntas_con_botones(test_Selecionado); break; } } } }
Respuestas
-
hola
Los controles dinamicos que creas en runtiem debes regenerarlo en cada postback de evento, como se explica en el articulo
Cómo: Crear dinámicamente controles en ASP.NET utilizando .NET Visual C#
lo recomendable es crearlo en el Load o Init de la pagina
si los creas en otro sitio no seria correcto
recomendaria si peudes evites crear controels de esta forma, usa un Repeater o algun control que cree los controles asignando un datasource, estos si contendran su estructura
saludos
Leandro Tuttini
Blog
MVP Profile
Buenos Aires
Argentina- Marcado como respuesta José Notario martes, 23 de mayo de 2017 14:33