none
Controles Dinamicos RRS feed

  • Pregunta

  • Tengo un problema

    Tengo una tabla de asp, y adiciono Treeview y treenodes dinamicamente tomados de BD, pero el problema es cuando hace postback se pierden los controles
    Todos estos controles tienen habilitado el ViewState.
    Como puedo solucionar esto.

    Gracias
    Daniel Vargas MCP - http://daniel-vargas.blogspot.com
    miércoles, 15 de julio de 2009 15:17

Respuestas

  • Hola de nuevo,

    si tienes habilitado es AutoPostback en tu control treeview, el evento de selección de nodo no se pierde. Por eso antes de que se procese (en el evento Page_PreInit) debes instanciar de nuevo el control treeview, de forma que pueda llegarle el evento de selección de nodo que provocó el Postback.

    Piensalo así. Si el control no fuera dinámico, a ti te llegaría un evento de SelectionChanged o SelectedIndexChanged o cualsea el evento que has lanzado desde el TreeView a un event handler que habrías definido tú. Aquí deberás hacer lo mismo pero a mano, es decir, algo tal que así:

    protected void Page_PreInit(object sender, EventArgs e)
    {
           TreeView tree=new TreeView();

           this.Controls.Add(tree);

           tree.SelectedIndexChanged+=new .... (TreeView_SelectedIndexChanged);

          
    }

    private void TreeView_SelectedIndexChanged(object sender, EventArgs e)   --> Esta cabecera puede cambiar. Ahora no la recuerdo.
    {
         //aqui procesas el evento que te llega del cliente, y obtienes el elemento seleccionado del arbol.

    }


    Yo diria que los tiros van por ahi...

    ===================================================================================== MCP (Microsoft Certified Professional) MCTS Web Apps (Microsoft Certified Technology Specialist) MCPD Web Apps (Microsoft Certified Professional Developer)
    • Marcado como respuesta Daniel20 miércoles, 15 de julio de 2009 15:57
    miércoles, 15 de julio de 2009 15:56

Todas las respuestas

  • Hola Daniel,

    la explicación es simple. Cuando creas un formulario web con controles estáticos (no creados dinamicamente), el archivo resultante es un archivo .aspx que el servidor utiliza a modo de plantilla cada vez que le llega una petición para ese formulario (o un postback). Es decir, el servidor coge todos los controles que hay definidos en la página .aspx, los instancia y los rellena con los valores correspondientes que encuentre en el viewstate y en el formulario (si es un postback).

    Cuando creas controles de forma dinámica éstos no forman parte de la plantilla .aspx y, cuando haces un postback, el servidor coge la página .aspx a la que haces referencia, instancia los controles que en ella se definen y los rellena con los valores del formulario y el viewstate. Evidentemente en esa plantilla no están los controles que has creado de forma dinámica. Debes ser tú quien vuelva a instanciarlos cuando llegue un postback, antes de que este se procese,  ya sea metiendolos en controles de usuario que luego puedas cargar con la función LoadControl o de cualquier otra forma que creas conveniente. Yo lo procesaria en el evento Page_PreInit .

    Espero que te sirva de ayuda!

    Si es así, porfavor, marca la respuesta como válida!

    Gracias!

    ===================================================================================== MCP (Microsoft Certified Professional) MCTS Web Apps (Microsoft Certified Technology Specialist) MCPD Web Apps (Microsoft Certified Professional Developer)
    miércoles, 15 de julio de 2009 15:41
  • Ok lo que hice fue quietar el IsPostaback, pero como hago para recuperar la informacion seleccionada en el treeview si los controles se pierde
    Daniel Vargas MCP - http://daniel-vargas.blogspot.com
    miércoles, 15 de julio de 2009 15:43
  • Hola de nuevo,

    si tienes habilitado es AutoPostback en tu control treeview, el evento de selección de nodo no se pierde. Por eso antes de que se procese (en el evento Page_PreInit) debes instanciar de nuevo el control treeview, de forma que pueda llegarle el evento de selección de nodo que provocó el Postback.

    Piensalo así. Si el control no fuera dinámico, a ti te llegaría un evento de SelectionChanged o SelectedIndexChanged o cualsea el evento que has lanzado desde el TreeView a un event handler que habrías definido tú. Aquí deberás hacer lo mismo pero a mano, es decir, algo tal que así:

    protected void Page_PreInit(object sender, EventArgs e)
    {
           TreeView tree=new TreeView();

           this.Controls.Add(tree);

           tree.SelectedIndexChanged+=new .... (TreeView_SelectedIndexChanged);

          
    }

    private void TreeView_SelectedIndexChanged(object sender, EventArgs e)   --> Esta cabecera puede cambiar. Ahora no la recuerdo.
    {
         //aqui procesas el evento que te llega del cliente, y obtienes el elemento seleccionado del arbol.

    }


    Yo diria que los tiros van por ahi...

    ===================================================================================== MCP (Microsoft Certified Professional) MCTS Web Apps (Microsoft Certified Technology Specialist) MCPD Web Apps (Microsoft Certified Professional Developer)
    • Marcado como respuesta Daniel20 miércoles, 15 de julio de 2009 15:57
    miércoles, 15 de julio de 2009 15:56