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é BenedictoNo .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