Visual Basic.NET - Ayuda treeview

 
Vista:

Ayuda treeview

Publicado por Alejandro (3 intervenciones) el 17/08/2017 09:44:27
Buenos días,

Es la primera vez que me enfrento a un treeview y necesito ayuda para meter los nodos hijos, nietos, bisnietos...dentro de los nodos padres.

Actualmente tengo una lista con los valores ordenados que recorro y en la que solo consigo meter a los padres.

Es decir, tengo una lista parecida a esta:

03 ---- AAA
031 ---- BBB
0311 ---- CCC
03111 ---- DDD
03112 ---- DDD
03113 ---- DDD
09 ---- EEE
091 ---- FFF
12 ---- GGG

Y el resultado que quiero obtener es este:

+03 ---- AAA
+031 ---- BBB
+0311 ---- CCC
03111 ---- DDD
03112 ---- DDD
03113 ---- DDD
+09 ---- EEE
091 ---- FFF
12 ---- GGG


Con este pequeño código comparo a los padres y los metro dentro del treeview:


1
2
3
4
5
6
7
8
9
10
Dim valor As String = "00"
 
For Each l In listavalores
	If l.ToString.Substring(0, 2) = valor.Substring(0, 2) Then
		Continue For
	Else
		TreeView1.Nodes.Add(l.ToString)
	End If
	valor = l.ToString
Next


El resultado que obtengo así es este:

03 ---- AAA
09 ---- EEE
12 ---- GGG


El caso está en que no tengo mucha idea en como recorrer ahora para poder meter los hijos, nietos, etc. de forma ordenada y en árbol en el treeview.


¿Alguna idea? Os agradecería mucho vuestra ayuda.


Un saludo,


Muchas gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Diego
Val: 605
Bronce
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Ayuda treeview

Publicado por Diego (190 intervenciones) el 17/08/2017 17:01:57
Hola Alejandro, es muy simple, para que te des una idea el elemento PADRE de todos los PADRES es el propio TREEVIEW, vamos a llamarlo TV, ese a su vez tiene un grupo de nodos, como bien hiciste vos, utilizaste el metodo Add, para agregar un elemento. Ese elemento que agregaste a su vez es un nodo que tiene un grupo propio de nodos (NODES) y asi sucesivamente.... Por ejemplo:

TV.Nodes(1).nodes(1).nodes(2).nodes.add("texto", "Hola") haría un mapa asi:

TV
+(A)
++(1) (Hijo de 1)
++(2) (Hijo de 1)
+++("Hola") <----- Nuevo nodo agregado (Hijo de 2)(Nieto de (A))

La manera mas práctica para agregar nodos es el metodo Add(Key, Text) de ese modo el texto que le pases a Key es la manera unica de hacer referencia a ese nodo, y text es el texto que queres que se vea. En el ejemplo que te escribo abajo, solo paso la key.

1
2
3
4
5
6
7
8
9
For i = 0 To 10
            tv.Nodes.Add(i)
            For j = 0 To 10
                tv.Nodes(i).Nodes.Add(j)
                For k = 0 To 10
                    tv.Nodes(i).Nodes(j).Nodes.Add(k)
                Next k
            Next j
        Next i

Eso armaría un árbol de 3 niveles de 10 elementos cada una y a su vez 10 niveles mas. Hay muchas formas de armar un treeview, pero esa me parece la mas práctica.

Cualquier duda, preguntanos.
Saludos y +Bytes.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Ayuda treeview

Publicado por Alejandro (3 intervenciones) el 18/08/2017 09:17:27
Muchas gracias por tu respuesta.


Hasta ahí creo que lo tengo todo claro. Pero la mayor duda que tengo es como ir comparando cada elemento de la lista con el anterior para saber si es padre, hijo o nieto y meterlo en su posición correspondiente en el treeview.

También imagino que hay que instanciar primero cada nodo nuevo que se va a crear antes de añadirlo al nodo padre que sería el propio treeview.


Es decir, mi duda es como ir comparando cada elemento con el anterior en los distintos bucles que voy recorriendo para crear nodos nuevos.
Había pensado con substring, ya que en realidad lo que cambia es el código en cada cadena, pero no se si es la forma más práctica o correcta.


Comparar 03 ---- AAA con 031 ---- BBB y ese con 0311 ---- CCC y así sucesivamente hasta llegar otra vez a un nodo padre (09 ---- EEE).


Muchas gracias y espero que podáis ayudarme,


Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Diego
Val: 605
Bronce
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Ayuda treeview

Publicado por Diego (190 intervenciones) el 18/08/2017 17:20:30
Hola Alejandro, siguiendo con el ejemplo anterior, en el evento AfterSelect de tu TreeView (TV) haciendo referencia a e.Node.FullPath te devuelve todo el caminio hacia la raiz, de ahi podés sacar la conexion facilmente con los nodos padres. Te recomiendo uses la funcion split para descomponer la cadena y listo....

1
2
3
4
Private Sub tv_AfterSelect(ByVal sender As System.Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles tv.AfterSelect
        MsgBox(e.Node.FullPath)
        dim camino as string () = split(e.node.fullpath, "\") 'Usa como separador de niveles \
End Sub

De ahi en más solo te resta analizar el arreglo "camino" para informar sobre que nodos estás trabajando.
Saludos y +Bytes.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Diego
Val: 605
Bronce
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Ayuda treeview

Publicado por Diego (190 intervenciones) el 18/08/2017 17:22:49
Alejandro, si querés tener una referencia directa tambien, podés llenar tu TV de la siguiente manera, asi le vas a dar nombre a tus nodos...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Dim i As Long, j As Long, k As Long
Dim key As String = "", subKey As String = "", subKey2 As String = ""
For i = 0 To 10
	key = i.ToString
	tv.Nodes.Add(key, i)
	For j = 0 To 10
		subKey = key & "_" & j.ToString
		tv.Nodes(key).Nodes.Add(subKey, j)
		For k = 0 To 10
			subKey2 = subKey & "_" & k.ToString
			tv.Nodes(key).Nodes(subKey).Nodes.Add(subKey2, k)
		Next k
	Next j
Next i

0 Nombre
0_0 Alejando
0_0_0 Magno
0_0_1 X
0_1 Diego
0_1_0 del Monte
0_1_1 Y

Esa sería la estructura que genera el codigo anterior, solo que con números, es mas facil para iterar con for. Para saber el nodo que seleccionaste, en el mismo evento del mensaje anterior lo recuperas con e.node.name, con split podes lo mismo para descomponer ese nombre.

Saludos y +Bytes.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Ayuda treeview

Publicado por Alejandro (3 intervenciones) el 19/08/2017 09:23:14
Muchas gracias por la ayuda. Me ha servido de mucho y he conseguido por fin hacerlo como quería.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar