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>
<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.
Comentários:
Paulo Lima Jr. disse:
eriva_br disse:
valew Paulo, eh nóis
abs
ErikDraven disse:
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:
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
Ver o restante dos comentários no fórum (e aproveitar pra comentar também !).