el Guille, la Web del Visual Basic, C#, .NET y más...

Seleccionar nodos en un TreeView usando las claves como en FullPath

 
Publicado el 24/Ene/2008
Actualizado el 24/Ene/2008
Autor: Guillermo 'guille' Som

En este artículo te explico cómo crear nodos para que las claves sean como el valor devuelto por FullPath, de forma que te resulte fácil hacer selecciones de nodos según los valores mostrados.
Te muestro el código tanto para Visual Basic como para C#.



 

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

 


Código para C Sharp (C#) 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
 


Código de ejemplo (comprimido):

Fichero con el proyecto de ejemplo para Visual Basic 2008: treeviewSeleccionNodo_VB.zip - 11.9 KB

(MD5 checksum: 3FA4DA79CF427B6A9462D28B84A9D569)

 

Fichero con el proyecto de ejemplo para Visual C# 2008: treeviewSeleccionNodo_CS.zip - 10.3 KB

(MD5 checksum: F38D06E0DAC7B0E806E1E3412EC7E129)


 


La fecha/hora en el servidor es: 23/12/2024 4:06:50

La fecha actual GMT (UTC) es: 

©Guillermo 'guille' Som, 1996-2024