Carregando uma TreeView e realizando uma busca utilizando recursividade:
(código comentado)

desenvolvido em Visual Studio 2005, utilizando a linguagem C#, com banco de dados SQL Server 2000

Crie um novo projeto web no VS 2005, vamos utilizar a página criada por padrão pelo VS Default.aspx
Será utilizado o banco de exemplo northwind, usando as tabelas Categories e Products relacionando pela coluna CategoryID, o relacionamento faremos com o dataset, desta forma serão carregados 2 niveis na treeview:
1º Nivel - Categorias
2º Nivel - Produtos


código HTML para a página Default.aspx:
CODE
<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>
  
   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  
   <html xmlns="http://www.w3.org/1999/xhtml" >
   <head runat="server">
       <title>TreeView</title>
   </head>
   <body>
       <form id="form1" runat="server">
       <div>
           <asp:TreeView
          
               ID="Tree"
               runat="server"
               ExpandDepth="0"
               OnSelectedNodeChanged="SelectedNodeChanged">
              
           </asp:TreeView>
           <asp:TextBox ID="TextBox1" runat="server" Style="z-index: 109; left: 548px; position: absolute;
               top: 55px"></asp:TextBox>&nbsp; &nbsp;&nbsp;
           <asp:Button ID="btnBusca" runat="server" Text="Busca"  Style="z-index: 109; left: 481px; position: absolute;
               top: 54px" OnClick="btnBusca_Click"/>    
       </div>
       </form>
   </body>
   </html>



códigos para o arquivo CS, Default.aspx.cs:

Namespaces:
CODE
using System;
   using System.Data;
   using System.Web;
   using System.Web.UI.WebControls;
   using System.Data.SqlClient;



código para o evento Page_Load, aqui será feito a conexão com o Banco de Dados e será carregado o treeview
CODE
protected void Page_Load(object sender, EventArgs e)
       {
           if (!IsPostBack)
           {
               //habilitando checkbox para o treeview
               Tree.ShowCheckBoxes = TreeNodeTypes.All;
  
               //definindo string de conexão com o banco de dados SQL Server
               string cnnStr = "data source=localhost; USER ID=sa; Password=; Initial Catalog=northwind";
               //criando e instanciando a váriavel de conexão
               SqlConnection con = new SqlConnection(cnnStr);
               //criando e instanciando SqlDataAdapter de categorias
               SqlDataAdapter dadCats = new SqlDataAdapter("SELECT * FROM Categories", con);
               //criando e instanciando SqlDataAdapter de Produtos
               SqlDataAdapter dadProd = new SqlDataAdapter("SELECT * FROM Products", con);
  
               //criando e instanciando DataSet para armazenar dados
               DataSet dst = new DataSet();
               //preenchendo DataSet com a tabela de Categorias
               dadCats.Fill(dst, "Categories");
               //preenchendo DataSet com a tabela de Produtos
               dadProd.Fill(dst, "Products");
  
               //Criando relacionamento entre Categoria e Produtos pela coluna CategoryID, para futura busca de dados
               dst.Relations.Add("Cat_Prod", dst.Tables["Categories"].Columns["CategoryID"], dst.Tables["Products"].Columns["CategoryID"]);
  
               //CARREGANDO O TREEVIEW
               foreach (DataRow masterRow in dst.Tables["Categories"].Rows)
               {
                   //carregando o 1º nivel (pais)
                   TreeNode masterNode = new TreeNode((string)masterRow["CategoryName"]);
                   Tree.Nodes.Add(masterNode);
                   //carregando o 2º nivel (filhos)
                   foreach (DataRow childRow in masterRow.GetChildRows("Cat_Prod"))
                   {
                       TreeNode childNode = new TreeNode();
                       childNode.Text = childRow["ProductName"].ToString();
                       childNode.Value = childRow["ProductID"].ToString();
                       masterNode.ChildNodes.Add(childNode);
                   }
               }
           }
       }


código para o evento Click do botão Procurar, a treeview será totalmente fechada caso estiver algum node aberto e será chamado a rotina de busca
CODE
protected void btnBusca_Click(object sender, EventArgs e)
       {
           //deixa a treeview totalmente fechada
           Tree.CollapseAll();
           //realiza a busca e caso encontrar expande e marca o checkbox nos itens encontrados
           this.Buscar(this.TextBox1.Text.Trim(), Tree.Nodes);
       }



código que realiza a busca, utilizando a recursividade, entrará em todos os nodes, caso for adicionado mais algum node, esta função já estará preparada, claro devido a esta ser recursiva
CODE
private void Buscar(string valorProcurado, TreeNodeCollection treeview)
       {
           int i = 0;
           foreach (TreeNode tre in treeview)
           {
               //utilizando a recursividade
               this.Buscar(valorProcurado, treeview[i].ChildNodes);
               //faz a busca por trecho de texto
               if (tre.Text.IndexOf(valorProcurado, StringComparison.OrdinalIgnoreCase) > -1)
               {
                   Response.Output.WriteLine("Chave do Item Encontrado:" + tre.Value);
                   Response.Output.WriteLine("Valor Encontrado:" + tre.Text);
                   Response.Output.WriteLine("Raiz do Item Encontrado:" + tre.ValuePath);
                   Response.Output.WriteLine("--------------------------------------------");
                   //tre.Selected = true; //seleciona o item encontrado
                   tre.Checked = true; //marca o checkbox do item encontrado
                   if (tre.Parent == null) //se não tiver parent (caso do 1º nivel)
                       tre.Expand(); //expande o nivel atual
                   else
                       tre.Parent.Expand(); //expande o nivel anterior
               }
               i++;
           }
       }



código para resposta do Click na treeview (somente para mostrar os dados do item clicado)
CODE
protected void SelectedNodeChanged(Object sender, EventArgs e)
       {
           //mostrando dados do item clicado
           Response.Output.Write("REGISTRO SELECIONADO<BR>VALUE: " + this.Tree.SelectedValue.ToString() + "<BR>TEXT: " + this.Tree.SelectedNode.Text);
       }





Resultado buscando a expressão "MIX", veja que foram encontrados 2 registros em categorias diferentes, estes tiveram seus grupos abertos (expand) e sua checkbox marcada






AUTOR: "eriva_br"

Dúvidas, criticas, contribuições, correções e adições seram bem vindas.

Você gostou? Comente no fórum!

Comentários:

Paulo Lima Jr. disse:

Sempre mandando muito bem hein Eriva, cara demais esse esquema.

eriva_br disse:

QUOTE(Paulo Lima Jr. @ 09/06/2007 - 12:05) [snapback]85894[/snapback]
Sempre mandando muito bem hein Eriva, cara demais esse esquema.

valew Paulo, eh nóis drinks.gif

abs joia.gif

ErikDraven disse:

Cara,

Parabéns pelo tópico. Estava procurando um bom exemplo como o seu, para usar o treeview.

Me inscrevi no fórum só para parabenizá-lo !!!

Obrigado pela grande ajuda que você me deu.

Abraços a você e a todos que lerem este seu tópico.

eriva_br disse:

QUOTE(ErikDraven @ 29/06/2007 - 10:23) [snapback]89947[/snapback]
Cara,

Parabéns pelo tópico. Estava procurando um bom exemplo como o seu, para usar o treeview.

Me inscrevi no fórum só para parabenizá-lo !!!

Obrigado pela grande ajuda que você me deu.

Abraços a você e a todos que lerem este seu tópico.

valew, abs cheers.gif

Ver o restante dos comentários no fórum (e aproveitar pra comentar também !).

Mais recentes em .Net

Usando fckeditor
Por Ivan - Bom galera vai aqui mais um tutorial que será bem últil:...
Lendo arquivos texto
Por quintelab - Este artigo traz um assunto simples mas que quase todos...
Formatando colunas da gridview em tempo de execução
Por quintelab - Este artigo mostra como formatar uma coluna da gridview...
Carregar página de pesquisa com pop up
Por quintelab - O artigo mostra como chamar uma página de pesquisa...
Exibindo mapa usando a api do google.
Por Ivan - Usando subgurim.net...

Ver mais Artigos de .Net.

Ver e retirar outras dúvidas no fórum Webly.

Alguns Direitos Reservados | RSS | O Fórum

Webly Portal e Fóruns - Internet + Humana | Design by ArthurHenrique.com