none
Mantener controles dinamicos de un GridView en un postback RRS feed

  • Pregunta

  • Hola a todos, le agradesco a cualquiera que me pueda ayudar con el siguiente tema:

    ASP.NET C#

    tengo un GridView al que se le agregan controles TextBox para que el usuario ingrese información, la creación de los controles se hace en el evento RowDataBound, luego se debe hacer un click en un boton para guardar la información ingresada en la base de datos del servidor, en el momento de hacer el postback, los controles agregados dinamicamente (TextBox) se desaparecen y se pierde la información ingresada por el usuario.

    No se que pasa.

    Gracias por su ayuda
    miércoles, 26 de agosto de 2009 15:03

Respuestas

  • Hola HernanH,

    te explico. Cuando tu creas un página .aspx normalmente le añades controles en tiempo de diseño. Bien, cuando guardas ese archivo y ejecutas, lo que hace ASP.NET es utilizar esa página aspx a modo de plantilla. Es decir, imagina que tienes una página llamada A.aspx que, en tiempo de diseño, has especificado que tiene un control Label y un control TextBox. Bien, si yo ahora guardo y ejecuto una llamada a la página A.aspx, lo que hace ASP.NET es coger esa página aspx, y crear una instancia por cada uno de los controles que en la página se definen (a modo de plantilla), por lo que creará un control Label y un TextBox. Luego, si tu has definido que se utilice ViewState para guardar el contenido de estos controles entre Postbacks, ASP.NET irá al ViewState y rellenará los controles Label y TextBox que acaba de instanciar con los valores que encuentre en el Viewstate.
    Hasta aqui bien. Que pása si yo creo controles dinámicamente (en tiempo de ejecución)? Si yo en el evento X del control TextBox, hago que se añada un control ComboBox a la página A.aspx, se enviará la respuesta al cliente y el ComboBox aparecerá, pero a la que haga un Postback, ASP.NET volverá a coger la plantilla (A.aspx) e instanciará los controles que allí se especifican (sólo el Label y el TextBox). El control ComboBox no aparece en la plantilla (A.aspx) por lo tanto no se instanciará a menos que lo hagas tú. Evidentemente en el Viewstate vienen los datos del ComboBox que antes añadiste, pero como ASP.NET no creará la instancia de ese control, no lo podrás recuperar.

    Lo que debes hacer, cuando creas controles dinámicos es, siempre que viene un Postback (lo puedes saber con la propiedad IsPostback), en el evento Page_PreInit, debes volver a instanciar aquellos controles que hayas definido dinamicamente. Piensa que los eventos de esos controles dinámicos no se pierden, pero con tal de que puedan ser procesados, esos controles deben existir en memoria (y si no los instancia tu, ASP.NET no tiene forma de saber qué controles dinámicos se crearon -- piensa que una vez ASP.NET devuelve la respuesta, los objetos que se han utilizado para genrarla se borran de memoria y, tal y como te he explicado, para volver a crearlos ASP.NET tira de la plantilla .aspx ).

    Bueno no sé si me he explicado con claridad. En resumen, para que puedas ver esos controles dinámicos, debes instanciarlos tu en el evento Page_PreInit con tal de que ASP.NET pueda asociarles los valores que vienen en el ViewState y ejecutar los eventos que se hayan lanzado sobre ellos.

     


    En caso de que la respuesta te sirva, porfavor, márcala como válida

    Muchas gracias y suerte!


    Javier Jiménez Roda


    MCP (Microsoft Certified Professional)
    MCTS (Microsoft Certified Technology Specialist)
    MCPD (Microsoft Certified Professional Developer)
    Blog: http://jimenezroda.wordpress.com

    jueves, 27 de agosto de 2009 7:45

Todas las respuestas

  • hola

    cuando dices hacer un postback, te refieres a un postback causado por un evento de la grilla que referencia a una accion de un command ?

    o sea se que la grilla tiene tipos de estados o sea si esta editando, por ahi si causas algun otro postback de otro boton fuera antes de terminar de editar la grilla refresca su render y vuelve al estado de visualizacion de datos


    - otra cosa que peudes verificar es si esta habilitado el viewstate de los controles, especialmente el de la grilla


    saludos
    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    jueves, 27 de agosto de 2009 4:03
  • Hola HernanH,

    te explico. Cuando tu creas un página .aspx normalmente le añades controles en tiempo de diseño. Bien, cuando guardas ese archivo y ejecutas, lo que hace ASP.NET es utilizar esa página aspx a modo de plantilla. Es decir, imagina que tienes una página llamada A.aspx que, en tiempo de diseño, has especificado que tiene un control Label y un control TextBox. Bien, si yo ahora guardo y ejecuto una llamada a la página A.aspx, lo que hace ASP.NET es coger esa página aspx, y crear una instancia por cada uno de los controles que en la página se definen (a modo de plantilla), por lo que creará un control Label y un TextBox. Luego, si tu has definido que se utilice ViewState para guardar el contenido de estos controles entre Postbacks, ASP.NET irá al ViewState y rellenará los controles Label y TextBox que acaba de instanciar con los valores que encuentre en el Viewstate.
    Hasta aqui bien. Que pása si yo creo controles dinámicamente (en tiempo de ejecución)? Si yo en el evento X del control TextBox, hago que se añada un control ComboBox a la página A.aspx, se enviará la respuesta al cliente y el ComboBox aparecerá, pero a la que haga un Postback, ASP.NET volverá a coger la plantilla (A.aspx) e instanciará los controles que allí se especifican (sólo el Label y el TextBox). El control ComboBox no aparece en la plantilla (A.aspx) por lo tanto no se instanciará a menos que lo hagas tú. Evidentemente en el Viewstate vienen los datos del ComboBox que antes añadiste, pero como ASP.NET no creará la instancia de ese control, no lo podrás recuperar.

    Lo que debes hacer, cuando creas controles dinámicos es, siempre que viene un Postback (lo puedes saber con la propiedad IsPostback), en el evento Page_PreInit, debes volver a instanciar aquellos controles que hayas definido dinamicamente. Piensa que los eventos de esos controles dinámicos no se pierden, pero con tal de que puedan ser procesados, esos controles deben existir en memoria (y si no los instancia tu, ASP.NET no tiene forma de saber qué controles dinámicos se crearon -- piensa que una vez ASP.NET devuelve la respuesta, los objetos que se han utilizado para genrarla se borran de memoria y, tal y como te he explicado, para volver a crearlos ASP.NET tira de la plantilla .aspx ).

    Bueno no sé si me he explicado con claridad. En resumen, para que puedas ver esos controles dinámicos, debes instanciarlos tu en el evento Page_PreInit con tal de que ASP.NET pueda asociarles los valores que vienen en el ViewState y ejecutar los eventos que se hayan lanzado sobre ellos.

     


    En caso de que la respuesta te sirva, porfavor, márcala como válida

    Muchas gracias y suerte!


    Javier Jiménez Roda


    MCP (Microsoft Certified Professional)
    MCTS (Microsoft Certified Technology Specialist)
    MCPD (Microsoft Certified Professional Developer)
    Blog: http://jimenezroda.wordpress.com

    jueves, 27 de agosto de 2009 7:45
  • Hola:

    Para hacer persistente los controles lo que he utilizado es un dynamicControlsPlaceholder de manera que conserva todos los controles creados en tiempo de ejecución.

    en esta web puedes leer más http://www.denisbauer.com/ASPNETControls/DynamicControlsPlaceholder.aspx

    por otro lado si es un control de usuario o una clase hay que persistirla para ello puedes ver algunos ejemplos aquí

    http://msdn.microsoft.com/es-es/library/system.web.ui.page.registerrequirescontrolstate.aspx

     

    saludos

    • Propuesto como respuesta JUANFHOYO lunes, 7 de junio de 2010 14:57
    lunes, 7 de junio de 2010 14:56