none
Agregar nodos a un treeview en tiempo de ejecucion RRS feed

  • Pregunta

  • Hola.

    Llevo varios dias "trasteando" con el control treeview y tengo  una duda que no consigo resolver 

    Cuando añadimos nodos de forma manual,  estos permanecen en el control aun despues de haber cerrado la aplicacion, pero no asi cuando los añadimos en tiempo de ejecucion.

    Hay un bonito y claro tutorial de Microsoft que enseña paso a paso como añadir nodos en tiempo de ejecucion, pero al cerrar el ejemplo estos nodos no permanecen. Obviamente si esto es asi de poco serviria el control, por lo que creo que algo se me escapa. ¿Que es?

    Gracias al que me lo aclare y larga vida al foro

    Diego

    viernes, 18 de marzo de 2016 2:20

Respuestas

  • Hola DiegC, ten en cuenta que el control TreeView sirve para presentar información en pantalla, no para almacenarla.
    Si quieres guardar la información del TreeView puedes usar una base de datos.


    Saludos, Javier J

    viernes, 18 de marzo de 2016 7:38
  • Hola Diego,

    el treeview siempre se crea vacío.

    Cuando creas nodos en tiempo de diseño lo que en realidad está haciendo Visual Studio es crear código que añade estos nodos en un método llamado InitializeComponent y que se ejecuta en el constructor del formulario.

    Viene a ser parecido a si tú incluyes en el evento Load del formulario el código treeview1.Nodes.Add("Nuevo nodo"). Cuando abras el formulario siempre se añadirá este nodo, pero no porque este guardado en el TreeView si no porque tú has añadido código para que se añada siempre al cargarse el formulario.

    Si durante la ejecución de tu programa añades nuevos nodos que quieres que se muestren la siguiente vez que se cargue el formulario deberás guardar la información de esos nodos, como te indicaba Javier, en un almacenamiento de datos persistente (base de datos, archivo de configuración, ....).


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    viernes, 18 de marzo de 2016 11:01
  • Pues eso, si quieres que los datos que introduces en tiempo de ejecución no se pierdan tendrás que almacenarlos en algún sitio y no solo eso, sino recuperarlos después. 
    Esto ocurre igual con un TextBox, en diseño puedes hacer que se inicialice con el valor que quieras pero si el usuario cambia ese valor y luego lo quieres obtener en la próxima ejecución tendrás que haberlo guardado y recuperarlo al ejecutar.

    Saludos, Javier J

    viernes, 18 de marzo de 2016 11:08

Todas las respuestas

  • Hola DiegC, ten en cuenta que el control TreeView sirve para presentar información en pantalla, no para almacenarla.
    Si quieres guardar la información del TreeView puedes usar una base de datos.


    Saludos, Javier J

    viernes, 18 de marzo de 2016 7:38
  • Hola Javier.

    Perdona que insista, pero es que sigo sin entenderlo.

    Yo no quiero "guardar" nada en el treview, solo persigo que al añadir un nodo   en tiempo de ejecucion este permanezca, justo lo que ocurre cuando lo añadimos de forma manual.

    Luego al clicar sobre estos nodos mostrare informacion que tengo claro debe estar en una base de datos.

    Digamos que lo que busco es "guardar la configuracion" del treeview al salir de la aplicacion.

    De que sirve:

    treeview1.nodes.add("Nuevo nodo")

    si al salir de la aplicacion este desaparece?

    Igual me explico mal

    viernes, 18 de marzo de 2016 10:39
  • Hola Diego,

    el treeview siempre se crea vacío.

    Cuando creas nodos en tiempo de diseño lo que en realidad está haciendo Visual Studio es crear código que añade estos nodos en un método llamado InitializeComponent y que se ejecuta en el constructor del formulario.

    Viene a ser parecido a si tú incluyes en el evento Load del formulario el código treeview1.Nodes.Add("Nuevo nodo"). Cuando abras el formulario siempre se añadirá este nodo, pero no porque este guardado en el TreeView si no porque tú has añadido código para que se añada siempre al cargarse el formulario.

    Si durante la ejecución de tu programa añades nuevos nodos que quieres que se muestren la siguiente vez que se cargue el formulario deberás guardar la información de esos nodos, como te indicaba Javier, en un almacenamiento de datos persistente (base de datos, archivo de configuración, ....).


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    viernes, 18 de marzo de 2016 11:01
  • Pues eso, si quieres que los datos que introduces en tiempo de ejecución no se pierdan tendrás que almacenarlos en algún sitio y no solo eso, sino recuperarlos después. 
    Esto ocurre igual con un TextBox, en diseño puedes hacer que se inicialice con el valor que quieras pero si el usuario cambia ese valor y luego lo quieres obtener en la próxima ejecución tendrás que haberlo guardado y recuperarlo al ejecutar.

    Saludos, Javier J

    viernes, 18 de marzo de 2016 11:08
  • Gracias a ambos.

    Ahora entiendo, y como suponia, nada facil. Supongo que habria que modificar app.config  o algun invento parecido y recuperar luego la informacion.

    Si conoceis algun enlace donde lo expliquen os lo agradeceria, sinó seguire investigando por ahi.

    Gracias

    viernes, 18 de marzo de 2016 13:37
  • Habría que conocer más detalles para ver cual puede ser la solución óptima.

    ¿De qué tipo de información se trata? ¿La aplicación tiene gestión de usuarios? ¿La información de los nodos a guardar debe estar asociada al usuario?

    Si nos cuentas un poco más en detalle lo que tratas de hacer seguro que encontramos la alternativa adecuada.


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    viernes, 18 de marzo de 2016 13:51
  • No es nada, Asier. Simplemente estaba probando.

    Tengo cientos de trozos de codigo desperdigados por el disco duro y estaba pensando en una manera de organizarlos.

    Sé que hay decenas de programas ya hechos que lo hacen, pero no es lo mismo.

    Pensaba en Treeview para organizarlos en carpetas, temas etc, pero si tan jodido es, mirare de hacerlo en registros de una base de datos para acceder a ellos de una forma ordenada.

    En VB6 hice uno que empleaba una base Acces y era comodisimo de usar, y ahora estaba experimentando con las nuevas virguerias de .NET

    viernes, 18 de marzo de 2016 14:56
  • Hola Diego:

    Si no quieres utilizar una base de datos, puede hacerlo igualmente para que cada vez que abras tu form se te carguen los nodos del treeview, es decir, se te rellene todo el treeview.

    Para crear los nodos por codigo puedes hacer lo siguiente:

    Private Sub CrearNodosTreeView1() ' Nodo Treeview1 '//BALANCES VISTA NORMAL Dim BalSitNormal As TreeNode = New TreeNode BalSitNormal.Name = "Balance de Situación" BalSitNormal.Text = "Balance de Situación." BalSitNormal.ImageIndex = 0 BalSitNormal.SelectedImageIndex = 0 Dim BalyResultados As TreeNode = New TreeNode

    BalyResultados.Name = "Balance de Situación"

    BalyResultados.Text = "Balance de Situación" BalyResultados.ImageIndex = 2 BalyResultados.SelectedImageIndex = 2

    BalyResultados.ForeColor = Color.Black BalyResultados.NodeFont = New Font(TreeView1.Font, FontStyle.Bold) BalyResultados.Expand()

    .../... Irias añadiendo nodos.

    Te comento que las imagenes las obtenemos de un archivo de recursos, en caso de qye quieras añadirle

    aalguna imagen.

    Por lo tanto ya tenemos los nodos correspondientes al control Treeview1, ahora solo queda añadirlo al evento Load del form o bien si quieres tambien los puedes añadir en vez del load al Initialize Components.

    Un cordial saludo.

    Gemma


    • Editado gemma_campillo viernes, 18 de marzo de 2016 15:20 Ampliar texto
    viernes, 18 de marzo de 2016 15:16
  • Gemma, tu codigo está bien y a simple vista se ve que funciona sin problemas, pero no resuelve el problema motivo de la consulta pues si el usuario añade un nuevo nodo este desaparece al cerrar la aplicacion. Habria que guardar los cambios introducidos por el usuario, (como dicen Asier y Javier) en algun fichero de configuracion y eso ya es harina de otro costal, al menos para mi.

    Creo que Treeview es un interesante control con infinitas posibildades justo por eso es complicado de manejar.  Seguiré investigando y recurriendo al foro cuando me vea atascado.

     
    viernes, 18 de marzo de 2016 16:31