Neste artigo vou demonstrar uma forma muito simples de criar uma TreeView, funcional com manutenção simples e com um estilo legal. Para criar esta TreeView utilizei LinqToSql que facilita muito a vida de qualquer programador. O primeiro passo é criar duas tabelas: Uma delas irá conter as url’s com as imagens de cada nó e outra o cadastro do nó (TreeNode).
| Diagrama do Banco de Dados | |
 | |
| Diagrama das Classes (DataContext) | |
 | |
Script para criação do Banco de dados
USE [dbTreeView]
GO
/****** Object: Table [dbo].[tbIcones] Script Date: 05/02/2010 01:17:11 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[tbIcones](
[IDIcone] [int] IDENTITY(1,1) NOT NULL,
[Descricao] [varchar](20) NOT NULL,
[urlImagem] [varchar](50) NOT NULL,
CONSTRAINT [PK_tbIcones] PRIMARY KEY CLUSTERED
(
[IDIcone] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object: Table [dbo].[tbTreeView] Script Date: 05/02/2010 01:17:11 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[tbTreeView](
[IDNo] [int] IDENTITY(1,1) NOT NULL,
[Alias] [varchar](20) NOT NULL,
[ParentID] [int] NOT NULL,
[IDIcone] [int] NOT NULL,
CONSTRAINT [PK_tbTreeView] PRIMARY KEY CLUSTERED
(
[IDNo] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object: ForeignKey [FK_tbTreeView_tbIcones] Script Date: 05/02/2010 01:17:11 ******/
ALTER TABLE [dbo].[tbTreeView] WITH CHECK ADD CONSTRAINT [FK_tbTreeView_tbIcones] FOREIGN KEY([IDIcone])
REFERENCES [dbo].[tbIcones] ([IDIcone])
GO
ALTER TABLE [dbo].[tbTreeView] CHECK CONSTRAINT [FK_tbTreeView_tbIcones]
GO
Tudo gerado, mãos a obra.
Para preencher os nós e seus respectivos filhos teremos que utilizar recursividade no preenchimento dos TreeNode’s, vamos criar um método que recebe um objeto TreeView e o ID do nó como parâmetro que começaremos a preencher.
No contrutor da classe Preenchimento(), atribuo coloco em memória os dados que utilizaremos (lista de ícones e Lista de nós).
private dbTreeViewDataContext _db;
private List<IconeEntidade> _icones;
private List<TreeViewEntidade> _TreeView;
public Preenchimento()
{
//Carrego tudo na memória para fazer as iterações
_db = new dbTreeViewDataContext();
//Como não faremos nenhum Update,desabilito a segmentação
//para evitar que o linq faça o mapeamento do que está sendo alterado
//com isso ganhamos performance.
_db.ObjectTrackingEnabled = false;
//Coloco em memória a lista de icones.
_icones = _db.IconeEntidades.ToList<IconeEntidade>();
//Coloco em memória a lista que contem os nós que será preenchida
_TreeView = _db.TreeViewEntidades.ToList<TreeViewEntidade>();
}
Agora vamos preencher os TreeNode’s pai e para cada TreeNode, preenchemos seus filhos.
public void PreencherTreeView(System.Web.UI.WebControls.TreeView objTreeView, int IDNoCarregar)
{
//Limpo os nodes existentes.
objTreeView.Nodes.Clear();
//passo por todos os nodes que foi passado como parâmetro para carregar. (organizando em ordem alfabética
foreach (var item in _TreeView.Where(p => p.ParentID == IDNoCarregar).OrderBy(p => p.ParentID).OrderBy(p => p.Alias))
{
//Preencho o nó pai
TreeNode nodePai = new TreeNode();
nodePai.Value = item.IDNo.ToString();
nodePai.Text = item.Alias;
nodePai.ImageToolTip = item.Alias;
nodePai.ImageUrl = _db.IconeEntidades.Where(p => p.IDIcone == item.IDIcone).FirstOrDefault().urlImagem;
//Preecho os filhos
PreencherNoFilho(nodePai);
//Adiciono o nó que foi preenchido
objTreeView.Nodes.Add(nodePai);
}
}
Para preencher os TreeNode’s filhos, recebemos o TreeNode pai (parent).
protected void PreencherNoFilho(TreeNode parentNode)
{
//Passo por todos os elementos filhos do nó pai
foreach (var item in _TreeView.Where(p => p.ParentID == int.Parse(parentNode.Value)).OrderBy(p => p.ParentID).OrderBy(p => p.Alias))
{
TreeNode noFiltro = new TreeNode(item.Alias,item.IDNo.ToString(),
_icones.Where(p => p.IDIcone == item.IDIcone).FirstOrDefault().urlImagem); //Adiciono a url da imagem
noFiltro.ImageToolTip = item.Alias; // Atribuo o texto que será exibido
noFiltro.SelectAction = TreeNodeSelectAction.SelectExpand; //Expando no nó.
parentNode.ChildNodes.Add(noFiltro); //adiciono na coleção de nós
PreencherNoFilho(noFiltro); //Preenchemos os filhos deste Node (recursividade)
}
}
Nossa estrutura pronta, vamos partir para a formatação.
Continua - Parte II
538ed4c9-21c9-4ec0-82c2-23369cacbdb2|3|3.7