Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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"](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
/applications/core/interface/imageproxy/imageproxy.php?img=http://img.photobucket.com/albums/v331/eriva_br/imagemTreeView.jpg&key=0dd5db198b9c37bea572f8f2652115ac8562732bf2af97d7fbc9a6251c43dc42" alt="Imagem Postada" />
AUTOR: "eriva_br"
Dúvidas, criticas, contribuições, correções e adições seram bem vindas.
Muito bacana o seu post, ate ae eu consegui fazer, e se caso ela tivesse mais um nivel, um 3º nivel, como ficaria?
aguardo!
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)
{
AUTOR: "eriva_br"
Dúvidas, criticas, contribuições, correções e adições seram bem vindas.