Jump to content

POWERED BY:

Archived

This topic is now archived and is closed to further replies.

eriva_br

[asp.net] Carregar e buscar na treeview

Recommended Posts

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:

<%@ 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>    
		   <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:

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

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

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

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)

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

Imagem Postada

 

 

 

 

 

AUTOR: "eriva_br"

 

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

Share this post


Link to post
Share on other sites

Velho muito bom mesmo sua busca, fiz algumas alterações/correções:

 

1- Desmarcar os checkboxes marcados na busca anterior;

2- Expandir os nodes que foram encontrados mesmo que a treeview tenha mais de dois níveis.

 

Acho que elas podem ser melhoradas, mas aqui vai ser usado apenas para um protótipo então deixo em aberto para melhorias, mas muito bom mesmo vou ganhar uns pontos com meu chefe!!!!!

 

código alterado 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

private void Buscar(string valorProcurado, TreeNodeCollection treeview)           
    {                          
        foreach (TreeNode tre in treeview)                   
        {                           
            //utilizando a recursividade                           
            this.Buscar(valorProcurado, tre.ChildNodes);

            //desmarca a seleção feita na busca anterior
            if (tre.Checked)
                tre.Checked = false;

            //faz a busca por trecho de texto                           
            if (tre.Text.IndexOf(valorProcurado, StringComparison.OrdinalIgnoreCase) > -1)
            {                                   
                                                   
                //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
                {
                    //expande a árvore até os itens encontrados na busca 
                    TreeNode parents = tre.Parent;
                    while (parents != null && parents.Expanded == false)
                    {
                        parents.Expand();
                        parents = parents.Parent;
                    }
                }
            }                             
        }           
    }

 

AUTOR: "eriva_br"

 

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

Share this post


Link to post
Share on other sites

×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.