Fala pessoaL!Nossa, faz muito tempo que nao posto nada e para falar a verdade, faz tempo que eu nem acesso meu blog. Estou sem tempo e com muitas preocupacoes. Viajarei para a Australia no fim desse ano e isso esta me deixando ansioso e muito nervoso. Correria total!!Bom, como o blog nao e sobre mim mas sim sobre analise e desenvolvimento de sistemas, vamos ao que interessa.Devido a um novo projeto da empresa, comecei a programar em asp.net C# ha poucos dias. Precisei fazer um controle de login dos usuarios e claro, um menu contendo todos os menus que o usuario tem acesso.So que esses menus estao cadastrados na base de dados. E agora?Nao achei nada na internet, nenhum blog de pessoas que ja fizeram isso em asp.net e disponibilizaram.TECNOLOGIAS E FERRAMENTAS UTILIZADASEstou utilizando o modelo entidade relacional Entity Framework da Microsoft, acessando uma base de dados MySQL (the best database ever! ;) )Nao irei tratar aqui sobre como fazer os relacionamentos das tabelas ou criacao e associacao entre as classes do nosso modelo objeto relacional, mas sim como criar o menu para o site e seus respectivos filhos.TABELAS USADAS NO EXEMPLOEu utilizei uma tabela com relacionamento Self One to Many. Para quem nao conhece esse tipo de relacionamento, vale a pena dar uma olhada nesse outro post em meu blog:http://devutils.blogspot.com/2008/12/sql-relacionamentos-self-to-self.htmlCREATE DATABASE `exemplomenu`USE `exemplomenu`DROP TABLE IF EXISTS `menus_web`;CREATE TABLE `menus_web` (`idmenus` int(7) unsigned NOT NULL AUTO_INCREMENT,`nome` varchar(45) NOT NULL COMMENT 'nome do item de menu',`ordem` int(7) unsigned DEFAULT NULL COMMENT 'para ordenacao dos itens de menu',`pai` int(7) unsigned DEFAULT NULL,`hint` varchar(255) DEFAULT NULL,`bitmap` int(7) DEFAULT NULL COMMENT 'icone do item de menu',`url` varchar(50) DEFAULT NULL,PRIMARY KEY (`idmenus`),KEY `fk_menus_menus1` (`pai`)) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=latin1;/*Data for the table `menus_web` */insert into `menus_web`(`idmenus`,`nome`,`ordem`,`pai`,`hint`,`bitmap`,`url`) values (1,'Veiculos',50,NULL,NULL,NULL,''),(2,'Relatorios',NULL,1,NULL,NULL,''),(3,'Por responsabilidade',NULL,2,NULL,NULL,'/veiculos/relatorios/responsabilidade.aspx'),(4,'Avarias por montadora',NULL,7,NULL,NULL,''),(5,'Avarias por modelo',NULL,7,NULL,NULL,''),(6,'Avarias por peca',NULL,7,NULL,NULL,''),(7,'Graficos',NULL,1,NULL,NULL,''),(8,'Por responsabilidade e periodo',NULL,2,NULL,NULL,''),(9,'Algodao',NULL,NULL,NULL,NULL,''),(10,'Relatorios',NULL,9,NULL,NULL,''),(11,'Sair',NULL,NULL,NULL,NULL,'sair.aspx');CRIACAO DO MENUUtilizarei o componente Menu, que se encontra na aba Navigation da ToolBox. Vamos deixar o ID dele como Menu1.Repare que o menu possui uma propriedade chamada MaximumDynamicDisplayLevels. Essa propriedade diz quantos nodes filhos o menu podera ter. //Objeto do tipo MenuItem (node de um menu)MenuItem vMenu;//Objeto array, do tipo MenuItemMenuItem[] vMenu2 = new MenuItem[5];int vCont = 0;Primeriamente vamos gerar um procedimento que nos traz todos os menus pais, ou seja, que contenha o valor pai igual a vazio.private void GerarMenu(){ using (kerpModel.kerpModelEntities dm = new kerpModel.kerpModelEntities()) { //SELECIONA OS DADOS DO MENU POR MEIO DO LINQ var consMenu = (from m in dm.menus_web where m.pai == null select m); //CORRE OS REGISTROS DO MENU foreach(kerpModel.menus_web row in consMenu) { //Cria um novo node para o menu vMenu = new MenuItem(row.nome.ToString()); vMenu.NavigateUrl = row.url.ToString(); Menu1.Items.Add(vMenu); //Chama o procedimento que verifica se o menu possui filhos, passando o id do menu como parametro this.GerarMenuFilho(int.Parse(row.idmenus.ToString())); } }}//Funcao que adiciona os filhos do item de menuprivate void GerarMenuFilho(int idpai){ using (kerpModel.kerpModelEntities dm = new kerpModel.kerpModelEntities()) { //SELECIONA OS DADOS DO MENU, QUE TEVE O ID PASSADO POR PARAMETRO var consMenu = (from m in dm.menus_web where m.pai == idpai select m); //CORRE OS REGISTROS DO MENU foreach (kerpModel.menus_web row in consMenu) { //Chama