Introducción:
Cuando seleccionas un nodo en un TreeView, el valor de la
propiedad FullPath contiene una cadena al estilo de
Nodo_Padre\Nodo_Hijo\Nodo_Nieto, es decir, te devuelve el "path" o ruta
de ese nodo al estilo de los directorios.
Aquí te voy a explicar cómo aprovechar esa forma de mostrar la ruta de un
nodo en concreto, con idea de que puedas usarlo para seleccionar el nodo del TreeView que quieras en cualquier momento y sin necesidad de
tener que recorrerlos todos para llegar al que te interesa.
El truco para hacer esto que te digo consiste en agregar las claves de los
nodos para que tengan ese mismo contenido, es decir, en lugar de dejar que sea
el propio runtime el que asigne los valores a las claves de los nodos, nosotros
los asignaremos, pero para que después nos sirva para esto que te acabo de
comentar al principio de este párrafo.
Después para buscar el nodo que coincide con el texto, usamos el método
Find, el cual devuelve un array del tipo TreeNode,
pero que en la mayoría de los casos, solo usaremos el primer elemento del array
devuelto por ese método.
En el siguiente código (para Visual Basic es el mostrado en el artículo,
para
C# lo puedes ver más abajo) te muestro cómo crear esas claves,
y como podrás comprobar, consiste en darle a los nodos hijos (sub nodos) la
misma clave que al padre, pero añadiéndole también la clave del hijo. Esas
claves en realidad se van formando con el texto mostrado. Por supuesto, este
truco solo es válido si no habrá repeticiones de claves, es decir, no habrá dos
nombres iguales en la misma rama del árbol... la situación más parecida es la
indicada de igualar esto a la estructura de un directorio, en la que no puede
haber dos nombres iguales en un mismo directorio (nodo).
' Para sacar valores aleatorios
Private rnd As New Random
Private Sub Form1_Load(ByVal sender As Object, _
ByVal e As EventArgs) _
Handles MyBase.Load
' Añadir nodos al TreeView
' y asignarles claves para que tengan el mismo valor
' que lo que devuelve FullPath
With TreeView1
For i As Integer = 1 To 10
Dim skNodo As String = "Nodo " & i.ToString("00")
Dim tvn As TreeNode = .Nodes.Add(skNodo, "Nodo " & i.ToString("00"))
For j As Integer = 1 To rnd.Next(2, 5) ' un valor de 2 a 4
Dim skHijo As String = skNodo & "\Hijo " & j.ToString
Dim tvn2 As TreeNode = tvn.Nodes.Add(skHijo, "Hijo " & j.ToString)
For k As Integer = 1 To rnd.Next(2, 4) ' un valor de 2 a 3
Dim skNieto As String = skHijo & "\Nieto " & k.ToString
tvn2.Nodes.Add(skNieto, "Nieto " & k.ToString)
Next
Next
Next
End With
End Sub
Después, para seleccionar uno de los nodos sabiendo el "path completo" lo
puedes hacer de esta forma (en el código tienes los comentarios para que sepas
lo que se hace exactamente):
Private Sub btnSeleccionar_Click(ByVal sender As Object, _
ByVal e As EventArgs) _
Handles btnSeleccionar.Click
If String.IsNullOrEmpty(TextBox2.Text) Then Exit Sub
' El nodo a seleccionar
Dim sKey As String = TextBox2.Text
' El método Find devuelve un array del tipo TreeNode
' pero normalmente tendrá solo un valor si el nodo existe
Dim tvn() As TreeNode = TreeView1.Nodes.Find(sKey, True)
If tvn IsNot Nothing AndAlso tvn.Length > 0 Then
TreeView1.SelectedNode = tvn(0)
End If
End Sub
Si en cualquier momento quieres conocer el valor devuelto por la propiedad
FullPath al seleccionar un nodo, lo puedes hacer con este método que intercepta
el evento AfterSelect.
' Cuando se selecciona un nodo del TreeView
Private Sub TreeView1_AfterSelect(ByVal sender As Object, _
ByVal e As TreeViewEventArgs) _
Handles TreeView1.AfterSelect
' Mostrar en el textBox el path completo
TextBox1.Text = e.Node.FullPath
'TextBox2.Text = e.Node.FullPath
End Sub
Para crear este ejemplo, necesitas lo siguiente:
- Un control TreeView llamado TreeView1
- Dos cajas de texto (TextBox), una llamada TextBox1 y la otra
TextBox2
- Un botón llamado btnSeleccionar
- Si usas C#, tendrás que interceptar estos eventos:
- El evento Load del formulario en el método
Form_Load
- El evento Click del botón en el método
btnSeleccionar_Click
- El Evento AfterSelect del TreeView
en el método TreeView1_AfterSelect
Después inserta todo el código mostrado en el formulario y ya tienes el
ejemplo funcionando.
Más abajo tienes el código para C# y los ZIP con los proyectos, tanto para
Visual Basic 2008 como para Visual C# 2008. Pero aunque esos proyectos estén
creados con Visual Studio 2008, también te valdrán para Visual Studio 2005.
Espero que te sea de utilidad.
Nos vemos.
Guillermo
El código para C#
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
// Para sacar valores aleatorios
private Random rnd = new Random();
private void Form1_Load(object sender, EventArgs e)
{
// Añadir nodos al TreeView
// y asignarles claves para que tengan el mismo valor
// que lo que devuelve FullPath
for(int i = 1; i <= 10; i++)
{
string skNodo = "Nodo " + i.ToString("00");
TreeNode tvn = TreeView1.Nodes.Add(skNodo, "Nodo " + i.ToString("00"));
for(int j = 1; j <= rnd.Next(2, 5); j++)
{ // un valor de 2 a 4
string skHijo = skNodo + @"\Hijo " + j.ToString();
TreeNode tvn2 = tvn.Nodes.Add(skHijo, "Hijo " + j.ToString());
for(int k = 1; k <= rnd.Next(2, 4); k++)
{ // un valor de 2 a 3
string skNieto = skHijo + @"\Nieto " + k.ToString();
tvn2.Nodes.Add(skNieto, "Nieto " + k.ToString());
}
}
}
}
// Cuando se selecciona un nodo del TreeView
private void TreeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
// Mostrar en el textBox el path completo
TextBox1.Text = e.Node.FullPath;
}
private void btnSeleccionar_Click(object sender, EventArgs e)
{
if(String.IsNullOrEmpty(TextBox2.Text)) return;
// El nodo a seleccionar
string sKey = TextBox2.Text;
// El método Find devuelve un array del tipo TreeNode
// pero normalmente tendrá solo un valor si el nodo existe
TreeNode[] tvn = TreeView1.Nodes.Find(sKey, true);
if(tvn != null && tvn.Length > 0)
{
TreeView1.SelectedNode = tvn[0];
}
}
}
Espacios de nombres usados en el código de este artículo:
System.Windows.Forms