eriva_br 7 Denunciar post Postado Janeiro 29, 2008 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 AUTOR: "eriva_br" Dúvidas, criticas, contribuições, correções e adições seram bem vindas. Compartilhar este post Link para o post Compartilhar em outros sites
Salgadonline 0 Denunciar post Postado Julho 29, 2009 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. Compartilhar este post Link para o post Compartilhar em outros sites
luckses 0 Denunciar post Postado Outubro 8, 2009 Muito bacana o seu post, ate ae eu consegui fazer, e se caso ela tivesse mais um nivel, um 3º nivel, como ficaria? aguardo! Compartilhar este post Link para o post Compartilhar em outros sites