Desenvolvimento - C#

Componente TreeView C#

No .NET Framework temos um componete chamado TreeView que que possui uma estrutura composta por uma arvore de nós que técnicamente chamos de "node".

por Everton José Benedicto



                No .NET Framework temos um componente chamado TreeView que que possui uma estrutura composta por uma arvore de nós que técnicamente chamamos de “node”. Abstraindo a funcionalidade do componente imagine um índice de um livro, ele possui os capítulos, dentro dos capítulos há subtópicos ou não, dentro desses subtopicos podem haver outros subtópicos.

                Com o TreeView você consegue criar esse mapeamento deixando-o com a aparência parecida com o Explorer do Windows (Tecla “Windows” + E, executa o Explorer). Para fixar melhor a ideia vamos fazer um exemplo utilizando a linguagem de programação C#.

                Crie um projeto no Visual Studio chamado TesteTreeView (C# WindowsForms), vamos colocar dois componetes no Form: TreeView e um Buton como na Figura 1 abaixo.


Figura 1.: Projeto TesteTreeView com o Form com os componetes TreeView e Buton.

Após colocar os componentes no Form vamos mudar os nomes dos componentes mude o nome(Name) do TreeView para tvw e o botão para btnCarregarArvore e vamos abrir o código fonte do Form1 (Apertando F7 ou Clicando com o botão direito do mouse em Form1/View Code) e vamos criar um método chamado “CarregaConteudoDiretorio”, como na listagem 1 abaixo.

public void CarregarConteudoDiretorioNode(TreeNode node, string caminho)

        {

            //Pegando os subdiretórios do caminho.

            string [] subDiretorios = Directory.GetDirectories(caminho);

            //Laço para percorrer o diretório do caminho

            for (int k = 0; k < subDiretorios.Length; k++)

            {

                TreeNode objNodeSubDiretorio = new TreeNode();

                //Pegar o nome do diretório, chamar o método Split para pegar somente o nome do diretório.

                string [] NomeSubDiretorio = subDiretorios[k].Split("\\");

                //Para colocar o nome do diretório no Node da árvore.

                objNodeSubDiretorio.Text = NomeSubDiretorio[NomeSubDiretorio.Length - 1];

                //comando para contrair o "tronco" da árvore.

                objNodeSubDiretorio.Collapse();

                //Colocar o caminho do subdiretório na tooltip do node.

                objNodeSubDiretorio.ToolTipText = subDiretorios[k];

                //Adiciona o nó a pasta.

                node.Nodes.Add(objNodeSubDiretorio);

                //Nesta parte do código eu faço uma recursão, ou seja, para cada subdiretório da pasta eu

                //chamo o proprio método para pegar os subdiretórios até acabar os subdiretórios.

                string[] verificaArquivo = objNodeSubDiretorio.Text.Split(".");

                if (verificaArquivo.Length == 1)

                {

                    CarregarConteudoDiretorioNode(objNodeSubDiretorio, objNodeSubDiretorio.ToolTipText);

                    objNodeSubDiretorio.Collapse();

                }

            }

            //Pegando os arquivos do diretório

            string[] arquivo = Directory.GetFiles(caminho);

            for (int j = 0; j < arquivo.Length; j++)

            {

                TreeNode objNodeArquivo = new TreeNode();

                //Pegando somente o nome do arquivo.

                string[] NomeArquivo = arquivo[j].Split("\\");

                //atribuindo um nome ao texto do node.

                objNodeArquivo.Text = NomeArquivo[NomeArquivo.Length - 1];

                //colocando o caminho do arquivo na tooltip do node.

                objNodeArquivo.ToolTipText = arquivo[j];

                //adicionando o node há arvore.

                node.Nodes.Add(objNodeArquivo);

            }

            // Expandindo o node no TreeView.

            node.Expand();

        }

Listagem 1: Método CarregaConteudoDiretorio.

Note que o código está comentado para os esclarecimentos de dúvidas. Depois de criar o método CarregaConteudoDiretorio vamos criar um outro método chamado PreencheTreeView, como na listagem 2 abaixo.

private void PreencheTreeView(TreeView tvw, string caminho)

{

            //Limpar os nodes da árvore

            tvw.Nodes.Clear();

            //Habilitando a tooltip dos Nodes

            tvw.ShowNodeToolTips = true;

            //Buscando as pastas do Diretório passado por parâmetro

            string[] pastas = Directory.GetDirectories(caminho);

            //Laço para percorre as pastas dos nodes

            for (int i = 0; i < pastas.Length; i++)

            {

                try

                {

                    //Criar um novo node

                    TreeNode objNodePasta = new TreeNode();

                    //Jogar em um array somente o nome das pastas

                    string[] NomePasta = pastas[i].Split("\\");

                    //Colocar o nome da pasta no Text do node

                    objNodePasta.Text = NomePasta[NomePasta.Length - 1];

                    //Contrair o node

                    objNodePasta.Collapse();

                    //Colocar o caminho da pasta no ToolTip do node

                    objNodePasta.ToolTipText = pastas[i];

                    //Adicionar o node há árvore

                    tvw.Nodes.Add(objNodePasta);

                    //Pegar os subdiretórios.

                    string[] subdiretorios = Directory.GetDirectories(pastas[i]);

                    //Laço para percorre os subdiretórios da pasta

                    for (int k = 0; k < subdiretorios.Length; k++)

                    {

                        //Cria um novo node

                        TreeNode objNodeSubDiretorio = new TreeNode();

                        //Pega somente os nomes dos subdiretórios

                        string[] NomeSubDiretorio = subdiretorios[k].Split("\\");

                        //Atribui o nome do subdiretório ao Text do node

                        objNodeSubDiretorio.Text = NomeSubDiretorio[NomeSubDiretorio.Length - 1];

                        //Contrai o node

                        objNodeSubDiretorio.Collapse();

                        //Colocando o caminho

                        objNodeSubDiretorio.ToolTipText = subdiretorios[k];

                        //Adiciona o node ao node da pasta

                        objNodePasta.Nodes.Add(objNodeSubDiretorio);

                        //Verificação se o node possui subdiretório, caso ele for uma pasta ele chama o método CarregarConteudoDiretorioNode

                        string[] verificaArquivo = objNodeSubDiretorio.Text.Split(".");

                        if (verificaArquivo.Length == 1)

                        {

                            CarregarConteudoDiretorioNode(objNodeSubDiretorio, objNodeSubDiretorio.ToolTipText);

                            //Contrai o node novamente.

                            objNodeSubDiretorio.Collapse();

                        }

                    }

                    //Pegando o nome dos arquivos da pasta

                    string[] arquivos = Directory.GetFiles(pastas[i]);

                    for (int j = 0; j < arquivos.Length; j++)

                    {

                        //Cria um novo node

                        TreeNode objNodeArquivo = new TreeNode();

                        //Pega somente o nome dos arquivos

                        string[] NomeArquivo = arquivos[j].Split("\\");

                        //Atribuindo ao Text do node o nome do arquivo

                        objNodeArquivo.Text = NomeArquivo[NomeArquivo.Length - 1];

                        //Colocando o caminho do arquivo ao ToolTip do node

                        objNodeArquivo.ToolTipText = arquivos[j];

                        //Adicionando o node a pasta

                        objNodePasta.Nodes.Add(objNodeArquivo);

                    }

                }

                catch

                {

                }

                //Pegando os arquivos da pasta raiz.

                string [] arquivosRaiz = Directory.GetFiles(caminho);

                //Criando um laço para varrer todos os arquivos.

                for (int l = 0; l < arquivosRaiz.Length; l++)

                {

                    //Criar um novo node

                    TreeNode objArquivoRaiz = new TreeNode();

                    //Pegando somente o nome do arquivo

                    string[] NomeArquivo = arquivosRaiz[l].Split("\\");

                    //Atribuindo ao Text do node o nome do arquivo

                    objArquivoRaiz.Text = NomeArquivo[NomeArquivo.Length - 1];

                    //Colocando na tooltip do node o caminho do arquivo

                    objArquivoRaiz.ToolTipText = arquivosRaiz[l];

                }

            }

        }

Listagem 2: Método PreencheTreeView

                Apos criar estes dois métodos vá para a tela de designer do Form1 e clique duas vezes no botão (btnCarregaArvore) para criar um evento pro botão e coloque o código a seguir na listagem 3 abaixo.

private void btnCarregarArvore_Click(object sender, EventArgs e)

{

PreencheTreeView(this.tvw, @"D:\");

}

Listagem 3: Evento do botão btnCarregaArvore

                Nota-se que no Segundo parâmetro do método PreencheTreeView passamos o caminho onde queremos mapear. Este caminho que iremos mapear é feito da seguinte maneira, usando o meu exemplo em que eu passo por parâmetro a minha unidade de disco “D” ele irá pegar o “D” como a raiz principal, e partindo deste pressuposto ele irá verificar se há subpastas e dentro das subpastas ele fará a mesma verificação até chegar no final de todas as subpastas. Vamos executar o projeto e clicar no Botão “OK” (Imagem da execução na Figura 2 abaixo).

Figura 2: Execução do projeto TesteTreeView

                Vamos colocar mais alguns detalhes para ficar mais interessante e melhor entendimento do conceito. Vamos criar um método que ao clicar duas vezes no node da arvore é aberta a pasta (se o node for pasta) ou executado o arquivo (se o node for arquivo).

                Para fazer isso vamos no designer do Form1 e vamos clicar no componente TreeView vamos nas propriedades clicamos no botão Events (símbolo de um raio) e vamos procurar o Evento chamado DoubleClick, clique duas vezes no espaço vazio a frente dele. Ele vai para a tela de visualização de código implemente no evento o código da listagem 4 abaixo.

private void tvw_DoubleClick(object sender, EventArgs e)

{

try

       {

System.Diagnostics.Process.Start(tvw.SelectedNode.ToolTipText);

}

catch

{

}

}

Listagem 4: Evento de dois cliques para o componete TreeView

O método estático da classe Process do namespace System.Diagnostics executa qualquer tipo de caminho especificado para ele, como se fosse o Run do window, verifique que por parâmetro eu passo a ToolTipText do node selecionado, lembrando que, nos métodos implementados colocamos o caminho da pasta ou arquivo no ToolTip deles.

Conclusão

O componete TreeView é muito interessante de se usar podemos alimentá-lo também por fontes de dados como xml, banco de dados, txt, etc, vá a você a escolha de como usa-lo.

Baseado no artigo da revista Codificando.net 16º Edição

Everton José Benedicto

Everton José Benedicto - Experiência de 3 anos com SQL Server 2000 e 2005, FastReport, Reporting Services e C#.