[asp.net] Carregar e buscar na treeview
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.
Discussão (2)
Carregando comentários...