none
Menu dinâmico com N filhos em c# RRS feed

  • 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.

    quarta-feira, 13 de junho de 2012 18:50

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
    quinta-feira, 14 de junho de 2012 12:34
    Moderador

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.html

    Vitor Mendes | Seu feedback é muito importante para todos!
    Visite o meu site: http://www.vitormendes.com.br/

    quarta-feira, 13 de junho de 2012 20:09
  • Olá Vitor, bom dia.

    Obrigado pelo artigo, mas gostaria de um exemplo utilizando o controle  "menu" do asp.net. No exemplo que passou ele monta com html mesmo.

    Valeu...

    quinta-feira, 14 de junho de 2012 11:22
  • 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
    quinta-feira, 14 de junho de 2012 12:34
    Moderador
  • Olá Olavo, boa tarde.

    Funcionou perfeitamente, agora é só colocar um css mesmo e está pronto.

    Muito obrigado.

    quinta-feira, 14 de junho de 2012 18:35