Usuário com melhor resposta
Menu dinâmico com N filhos em c#

Pergunta
-
Boa tarde pessoal,
Estou precisando montar um menu dinâmico que será utilizado em conjunto posterior com um módulo de segurança para que o usuário visualize somente os itens e sub-itens de menu os quais ele tem permissão.
Gostaria de saber se alguém possui um exemplo de geração menu utilizando dados de um banco de dados e que permita a inclusão de N sub-itens de menu.
Respostas
-
Rafael, bom dia.
Vamos a uma idealização do que você quer, primeiro temos de criar uma tabela no banco de dados para isto.
use example go create table Menu(Id int primary key, Titulo nvarchar(255) not null, PaiId int null) go insert into Menu(Id,Titulo)values(1,'Lojas') insert into Menu(Id,Titulo)values(2,'Produtos') insert into Menu(Id,Titulo)values(3,'Empregados') insert into Menu(Id,Titulo,PaiId)values(4,'Ceará',1) insert into Menu(Id,Titulo,PaiId)values(5,'Pernambuco',1) insert into Menu(Id,Titulo,PaiId)values(6,'Alagoas',1) insert into Menu(Id,Titulo,PaiId)values(7,'Fortaleza',4) insert into Menu(Id,Titulo,PaiId)values(8,'Crato',4) insert into Menu(Id,Titulo,PaiId)values(9,'Recife',5) insert into Menu(Id,Titulo,PaiId)values(10,'Olinda',5)
Agora vamos ao nosso código C#
private void carregaMenu() { using (SqlConnection conn = new SqlConnection(connString)) { conn.Open(); using (SqlCommand cmd = new SqlCommand("select Id, Titulo, PaiId from Menu order by Id", conn)) { SqlDataReader dtr = cmd.ExecuteReader(); while (dtr.Read()) { MenuItem mi = null; mi = new MenuItem(dtr["Titulo"].ToString(), dtr["Id"].ToString()); //Verifica se a linha é raiz if (dtr["PaiId"] == DBNull.Value) { //Adiciona um novo nó no Menu Menu1.Items.Add(mi); } else { miPaiNo = null; MenuItem miPai = localizaMenuPai(Menu1.Items, (int)dtr["PaiId"]); if (miPai != null) miPai.ChildItems.Add(mi); } } } } } /// <summary> /// Variável estática para utilização de retorno no método recursivo de Localização do MenuPai /// </summary> static MenuItem miPaiNo = null; /// <summary> /// Método recursivo para localizar o MenuItem Pai /// </summary> /// <param name="menuItemCollection"></param> /// <param name="PaiId"></param> /// <returns></returns> private MenuItem localizaMenuPai(MenuItemCollection menuItemCollection, int PaiId) { foreach (MenuItem mi in menuItemCollection) { if (mi.Value.Equals(PaiId.ToString())) miPaiNo = mi; else if (mi.ChildItems != null) this.localizaMenuPai(mi.ChildItems, PaiId); } return miPaiNo; }
Olavo Oliveira Neto
http://olavooneto.wordpress.com
Twitter @Olavooneto
Facebook Olavo Neto
Linkedin Olavo Neto
Se for útil marque como resposta e faça um Developer feliz :)- Marcado como Resposta Rafael Reis quinta-feira, 14 de junho de 2012 18:35
Todas as Respostas
-
Veja este post que um colega meu fez sobre menu + recursividade, creio que vá te ajudar muito:
http://www.emilaneze.com.br/2011/11/aspnet-menu-recursivo.htmlVitor Mendes | Seu feedback é muito importante para todos!
Visite o meu site: http://www.vitormendes.com.br/ -
-
Rafael, bom dia.
Vamos a uma idealização do que você quer, primeiro temos de criar uma tabela no banco de dados para isto.
use example go create table Menu(Id int primary key, Titulo nvarchar(255) not null, PaiId int null) go insert into Menu(Id,Titulo)values(1,'Lojas') insert into Menu(Id,Titulo)values(2,'Produtos') insert into Menu(Id,Titulo)values(3,'Empregados') insert into Menu(Id,Titulo,PaiId)values(4,'Ceará',1) insert into Menu(Id,Titulo,PaiId)values(5,'Pernambuco',1) insert into Menu(Id,Titulo,PaiId)values(6,'Alagoas',1) insert into Menu(Id,Titulo,PaiId)values(7,'Fortaleza',4) insert into Menu(Id,Titulo,PaiId)values(8,'Crato',4) insert into Menu(Id,Titulo,PaiId)values(9,'Recife',5) insert into Menu(Id,Titulo,PaiId)values(10,'Olinda',5)
Agora vamos ao nosso código C#
private void carregaMenu() { using (SqlConnection conn = new SqlConnection(connString)) { conn.Open(); using (SqlCommand cmd = new SqlCommand("select Id, Titulo, PaiId from Menu order by Id", conn)) { SqlDataReader dtr = cmd.ExecuteReader(); while (dtr.Read()) { MenuItem mi = null; mi = new MenuItem(dtr["Titulo"].ToString(), dtr["Id"].ToString()); //Verifica se a linha é raiz if (dtr["PaiId"] == DBNull.Value) { //Adiciona um novo nó no Menu Menu1.Items.Add(mi); } else { miPaiNo = null; MenuItem miPai = localizaMenuPai(Menu1.Items, (int)dtr["PaiId"]); if (miPai != null) miPai.ChildItems.Add(mi); } } } } } /// <summary> /// Variável estática para utilização de retorno no método recursivo de Localização do MenuPai /// </summary> static MenuItem miPaiNo = null; /// <summary> /// Método recursivo para localizar o MenuItem Pai /// </summary> /// <param name="menuItemCollection"></param> /// <param name="PaiId"></param> /// <returns></returns> private MenuItem localizaMenuPai(MenuItemCollection menuItemCollection, int PaiId) { foreach (MenuItem mi in menuItemCollection) { if (mi.Value.Equals(PaiId.ToString())) miPaiNo = mi; else if (mi.ChildItems != null) this.localizaMenuPai(mi.ChildItems, PaiId); } return miPaiNo; }
Olavo Oliveira Neto
http://olavooneto.wordpress.com
Twitter @Olavooneto
Facebook Olavo Neto
Linkedin Olavo Neto
Se for útil marque como resposta e faça um Developer feliz :)- Marcado como Resposta Rafael Reis quinta-feira, 14 de junho de 2012 18:35
-