none
Controles Dinámicos: Desaparecen RRS feed

  • Pregunta

  • ASP.NET 3.5 / Visual C# 2010

    Hola a todos

    Al crear Botones dinámicamente, luego de asignarles un Controlador De Evento, al añadirlos a un Control Panel, pulsando en un Botón (creado en Tiempo De Diseño), se muestran correctamente, pero...

    Al intentar ejecutar el Controlador De Evento respectivo pulsando en uno de los Botones Dinámicos, sucede lo siguiente:

    1º No se ejecuta nada.

    2º Los Botones desaparecen.

    En la Documentación de Microsoft se indica que la Implementación de los Controles Dinámicos ha de realizarse en el Evento Init de la Página (Page_Init), pero se necesita hacerlo recién al pulsar un Botón creado en Tiempo De Diseño, pues primero se debe leer un Control TextBox, donde se ingresa el número de Botones que se han de crear. Esta lectura, obviamente no se puede realizar desde el Evento de Página indicado anteriormente, ya que esto sucede antes de cargarse y mostrarse la Página.

    ¿Cómo se puede lograr hacer esto?

    Desde ya Muchísimas Gracias


    Skar.2007

    miércoles, 17 de julio de 2013 8:03

Respuestas

  • Puedes crearlos en el evento Page_Load() dentro de un bloque IsPostback, capturar que objeto produjo dicho postback y si éste es el botón en cuestión, crear los botones dinamicos

     if (this.Page.IsPostback)//hemos relizado un postback

    {

     // crear botones dinamicos

     if (GetPostBackControl(this.Page).Id == "bton_CrearBotones")

     { .....}

    }

    public static Control GetPostBackControl(Page page)
             {
                 Control postbackControlInstance = null;
                 string postbackControlName = page.Request.Params.Get("__EVENTTARGET");
                 if (postbackControlName != null && postbackControlName != string.Empty)
                 {
                     postbackControlInstance = page.FindControl(postbackControlName);
                 }
                 else
                 {
                     // handle the Button control postbacks
                     for (int i = 0; i < page.Request.Form.Keys.Count; i++)
                     {
                         postbackControlInstance = page.FindControl(page.Request.Form.Keys[i]);
                         if (postbackControlInstance is System.Web.UI.WebControls.Button)
                         {
                             return postbackControlInstance;
                         }
                     }
                 }
                 // handle the ImageButton postbacks
                 if (postbackControlInstance == null)
                 {
                     for (int i = 0; i < page.Request.Form.Count; i++)
                     {
                         if (page.Request.Form.Keys[i] != null && ((page.Request.Form.Keys[i].EndsWith(".x")) || (page.Request.Form.Keys[i].EndsWith(".y"))))
                         {
                             postbackControlInstance = page.FindControl(page.Request.Form.Keys[i].Substring(0, page.Request.Form.Keys[i].Length - 2));
                             return postbackControlInstance;
                         }
                     }
                 }
     
                return postbackControlInstance;
             }
     
    te paso el código para recuperar el control que realiza el postback


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos

    miércoles, 17 de julio de 2013 9:07
    Moderador
  • hola

    como veras en la explicacion

    CÓMO: Crear controles dinámicamente en ASP.NET con Visual Basic .NET

    lo controles dinamicos es recomendable definirlos en los eventos Init o Load de la pagina

    en cualquier otro evento se perdera al realizarse un evento de cualquier control, en cada postback debes reconstruirlos para que se creen nuevamente

    En la Documentación de Microsoft se indica que la Implementación de los Controles Dinámicos ha de realizarse en el Evento Init de la Página (Page_Init), pero se necesita hacerlo recién al pulsar un Botón creado en Tiempo De Diseño,

    entonces agregaras logica en este evento para determinar que boton lanza el eventopara dibujar el control dinamico

    how to detect which button was clicked on page load?

    pero ojo una vez que detectas esto deberias poner en Session algun flag para que lo siga realizando en las otras oportunidades ya que imagino este boton no sera el causando de los demas evantos sino que seran otros controls pero aun asi se necesita generar los controles dinamicos

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    miércoles, 17 de julio de 2013 10:51
  • Estimado Skar.2007

    Puedes hacerlo todo desde el Page_Init, es la recomendacion... la creacion de los controles (y alli mismo el delegado del evento de cada control que necesites) Asi en cada postback se crea

    Ahora bien, generar a partir de un click de un boton.. para eso en el Page_Init tienes que verificar que el boton se hizo click. Y alli es el primer "inconveniente" por llamarlo de alguna manera. En el Page_init no tenemos valores de controles ni podemos recuperar cosas directamente del control.. sino del request
    Entonces como sabemos si se hizo click en el boton

    O sea como recuperar valores de controles que todavia no se "Asignaron" (el viewsstate no se aplico).. bueno esto sigue siendo un HTTP y podemos acceder al request.. solo que necesitas conocer el Identificador Unico (UniqueID) con el que viene en el encabezado HTTP como post, asi podemos leer el valor

    Un ejemplo:
    Obtiendo si se hizo click en un boton y obtener la cantidad de controles a crear de un textbox

     protected void Page_Init(object sender, EventArgs e)
        {
         
            var btnGenerarUniqueId = btnGenerar.UniqueID;
    
            if (Page.Request[btnGenerarUniqueId]!=null)
            {
                var txtCantidadControlesUniqueId = txtCantidadControles.UniqueID;
                var cantidad = Int32.Parse(Page.Request[txtCantidadControlesUniqueId]);
    
                GenerarControles(cantidad );
            }
    
        }

    Ahora bien... pensemos:
    Se creara los controles cuando se haga click en el boton, pero debes seguir creandolo luego en cada post.. asi que es necesario colocar un hidden para verificar si se debe seguir creando dichos controles (idem a lo que te comenta LEandro con session)

    Pruebalo y comentanos que tal te fue, o si quieres podemos hacer una demo.. con la funcionalidad que quieres. PEro prueba primero y comentanos.

    Enlaces que te pueden ayudar

    Bueno espero que te sirva de ayuda o guia


    Jose. A Fernandez | blog: http://geeks.ms/blogs/fernandezja

    sábado, 20 de julio de 2013 16:06

Todas las respuestas

  • Puedes crearlos en el evento Page_Load() dentro de un bloque IsPostback, capturar que objeto produjo dicho postback y si éste es el botón en cuestión, crear los botones dinamicos

     if (this.Page.IsPostback)//hemos relizado un postback

    {

     // crear botones dinamicos

     if (GetPostBackControl(this.Page).Id == "bton_CrearBotones")

     { .....}

    }

    public static Control GetPostBackControl(Page page)
             {
                 Control postbackControlInstance = null;
                 string postbackControlName = page.Request.Params.Get("__EVENTTARGET");
                 if (postbackControlName != null && postbackControlName != string.Empty)
                 {
                     postbackControlInstance = page.FindControl(postbackControlName);
                 }
                 else
                 {
                     // handle the Button control postbacks
                     for (int i = 0; i < page.Request.Form.Keys.Count; i++)
                     {
                         postbackControlInstance = page.FindControl(page.Request.Form.Keys[i]);
                         if (postbackControlInstance is System.Web.UI.WebControls.Button)
                         {
                             return postbackControlInstance;
                         }
                     }
                 }
                 // handle the ImageButton postbacks
                 if (postbackControlInstance == null)
                 {
                     for (int i = 0; i < page.Request.Form.Count; i++)
                     {
                         if (page.Request.Form.Keys[i] != null && ((page.Request.Form.Keys[i].EndsWith(".x")) || (page.Request.Form.Keys[i].EndsWith(".y"))))
                         {
                             postbackControlInstance = page.FindControl(page.Request.Form.Keys[i].Substring(0, page.Request.Form.Keys[i].Length - 2));
                             return postbackControlInstance;
                         }
                     }
                 }
     
                return postbackControlInstance;
             }
     
    te paso el código para recuperar el control que realiza el postback


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos

    miércoles, 17 de julio de 2013 9:07
    Moderador
  • hola

    como veras en la explicacion

    CÓMO: Crear controles dinámicamente en ASP.NET con Visual Basic .NET

    lo controles dinamicos es recomendable definirlos en los eventos Init o Load de la pagina

    en cualquier otro evento se perdera al realizarse un evento de cualquier control, en cada postback debes reconstruirlos para que se creen nuevamente

    En la Documentación de Microsoft se indica que la Implementación de los Controles Dinámicos ha de realizarse en el Evento Init de la Página (Page_Init), pero se necesita hacerlo recién al pulsar un Botón creado en Tiempo De Diseño,

    entonces agregaras logica en este evento para determinar que boton lanza el eventopara dibujar el control dinamico

    how to detect which button was clicked on page load?

    pero ojo una vez que detectas esto deberias poner en Session algun flag para que lo siga realizando en las otras oportunidades ya que imagino este boton no sera el causando de los demas evantos sino que seran otros controls pero aun asi se necesita generar los controles dinamicos

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    miércoles, 17 de julio de 2013 10:51
  • Estimado Skar.2007

    Puedes hacerlo todo desde el Page_Init, es la recomendacion... la creacion de los controles (y alli mismo el delegado del evento de cada control que necesites) Asi en cada postback se crea

    Ahora bien, generar a partir de un click de un boton.. para eso en el Page_Init tienes que verificar que el boton se hizo click. Y alli es el primer "inconveniente" por llamarlo de alguna manera. En el Page_init no tenemos valores de controles ni podemos recuperar cosas directamente del control.. sino del request
    Entonces como sabemos si se hizo click en el boton

    O sea como recuperar valores de controles que todavia no se "Asignaron" (el viewsstate no se aplico).. bueno esto sigue siendo un HTTP y podemos acceder al request.. solo que necesitas conocer el Identificador Unico (UniqueID) con el que viene en el encabezado HTTP como post, asi podemos leer el valor

    Un ejemplo:
    Obtiendo si se hizo click en un boton y obtener la cantidad de controles a crear de un textbox

     protected void Page_Init(object sender, EventArgs e)
        {
         
            var btnGenerarUniqueId = btnGenerar.UniqueID;
    
            if (Page.Request[btnGenerarUniqueId]!=null)
            {
                var txtCantidadControlesUniqueId = txtCantidadControles.UniqueID;
                var cantidad = Int32.Parse(Page.Request[txtCantidadControlesUniqueId]);
    
                GenerarControles(cantidad );
            }
    
        }

    Ahora bien... pensemos:
    Se creara los controles cuando se haga click en el boton, pero debes seguir creandolo luego en cada post.. asi que es necesario colocar un hidden para verificar si se debe seguir creando dichos controles (idem a lo que te comenta LEandro con session)

    Pruebalo y comentanos que tal te fue, o si quieres podemos hacer una demo.. con la funcionalidad que quieres. PEro prueba primero y comentanos.

    Enlaces que te pueden ayudar

    Bueno espero que te sirva de ayuda o guia


    Jose. A Fernandez | blog: http://geeks.ms/blogs/fernandezja

    sábado, 20 de julio de 2013 16:06
  • Como sabrás, si el control creado dinámicamente no corre desde el servidor (osea, que no tiene la propiedad runat="server" establecida), el método que ofreces de GetPostBackControl(que dicho sea de paso, es muy útil, y te doy las gracias por dicho aporte), no detecta este control, ¿por qué crees que sea?

    sábado, 4 de mayo de 2019 15:21