none
O que está errado neste código - Menu Perfil de Usuário (nova versão) RRS feed

  • Pergunta

  • Olá pessoal,

    Há algum tempo postei aqui uma dúvida sobre montar um menu de acordo com o perfil de usuários usando o componente Menu do próprio Visual Studio. Hoje a dúvida é basicamente a mesma, mas o código agora ficou mais simples, só que ao montar os submenus do segundo menu estão sendo duplicados. Alguém tem idéia de como corrigir este código?

    Private Sub MontaMenu(ByVal pTexto As String, ByVal pValor As Integer, ByVal pPagina As String)
            Menu1.Items.Add(New MenuItem(pTexto, pValor, "", pPagina, ""))

        End Sub

        Private Sub MontaSubmenu(ByVal pItem As Integer, ByVal pTexto As String, ByVal pValor As Integer, ByVal pPagina As String)
            Menu1.Items.Item(pItem).ChildItems.Add(New MenuItem(pTexto, pValor, "", pPagina, ""))

        End Sub

        Private Sub ListarTipos()
            Dim Ds, Ds2 As Data.DataSet

            Ds = Menu.ListarTipos("")
            If Not Ds Is Nothing Then
                If Ds.Tables(0).Rows.Count > 0 Then

                    ' **************************************************************************
                    For I As Integer = 0 To Ds.Tables(0).Rows.Count - 1
                        MontaMenu(Ds.Tables(0).Rows(I)("TIPO"),
                                  Ds.Tables(0).Rows(I)("modulo_tipo"),
                                  "")

                        Ds2 = Submenu.ConsultarGrid(" A.perfil_codigo = 1 AND C.modulo_tipo = " & Ds.Tables(0).Rows(I)("modulo_tipo"), "")
                        For C As Integer = 0 To Ds2.Tables(0).Rows.Count - 1
                            MontaSubmenu(I, Ds2.Tables(0).Rows(C)("modulo_nome"), C, Ds2.Tables(0).Rows(C)("modulo_arquivo"))
                        Next
                    Next
                    ' **************************************************************************

                End If
            End If

        End Sub

    Se alguém tiver outra forma para montar este menu, por favor, postem aqui.

    Grato,

    Ilano

    terça-feira, 1 de maio de 2012 19:54

Todas as Respostas

  • Alguém????
    sábado, 5 de maio de 2012 12:32
  • Olá!!! 

    Bom essa é minha primeira participação aqui no Forum, espero que eu consiga ajudar.

    Segue um código que utilizei... É em C#, espero que não tenha problema!!!

    private void CarregaMenuBase()
        {
    
            /*
             * Montar a query que recupera os menus filhos
             * 
             * ATENÇÃO:
             * Aqui estou utilizando Entity Framework e tenho um método que recupera os Menus da tabela
             * e retorna como IQueryable
             * NESSE EXEMPLO MINHA TABELA DE MENU É AUTO-RELACIONAL(Recursiva)
             * 
             */
            var lstMenuPai = ConsultarMenu().Where(m => m.MenuPaiID == null).ToList();
    
            foreach (var item in lstMenuPai)
            {
                //Monta o item do menu
                MenuItem menuPai = new MenuItem();
                menuPai.Text = item.Nome;
                menuPai.NavigateUrl = item.Descricao;
                menuPai.ToolTip = item.Nome;
    
                //Recupero os subMenus do Menu Pai
                List<MenuItem> lstMenuFilho = CarregarSubMenu(idMenuPai);
    
                //Loop para montar o SubMenu
                foreach (var item in lstMenuFilho)
                {
                    //Monta o item do SubMenu
                    MenuItem menuFilho = new MenuItem();
                    menuFilho.Text = item.Text;
                    menuFilho.NavigateUrl = item.NavigateUrl;
                    menuFilho.ToolTip = item.ToolTip;
                    menuFilho.Value = item.Value;
                    
                    menuPai.ChildItems.Add(menuFilho);
                }
    
                //Popula o Componente MENU
                NavigationMenu.Items.Add(menuPai);
            }
        }
    
        private List<MenuItem> CarregarSubMenu(int idMenuPai)
        {
            /*
             * Montar a query que recupera os menus filhos
             * 
             * ATENÇÃO:
             * Aqui estou utilizando Entity Framework e tenho um método que recupera os Menus da tabela
             * e retorna como IQueryable
             * LEMBRANDO QUE NESSE EXEMPLO MINHA TABELA DE MENU É AUTO-RELACIONAL(Recursiva)
             * 
             */
            var lstMenuFilho = ConsultarMenu().Where(m => m.MenuPaiID == idMenuPai).ToList();
    
            List<MenuItem> lstSubMenu = new List<MenuItem>();
    
            foreach (var item in lstMenuFilho)
            {
                MenuItem itemMenuFilho = new MenuItem();
                itemMenuFilho.Text = item.Nome;
                itemMenuFilho.NavigateUrl = item.Descricao;
                itemMenuFilho.ToolTip = item.Nome;
                itemMenuFilho.Value = Convert.ToString(item.FuncionalidadeID);
    
                lstSubMenu.Add(itemMenuFilho);
            }
    
            return lstSubMenu;
        }

    Bom essa foi uma solução encontrada, espero que ajude em algo ou pelo menos de uma luz... hehehehe

    Abraços,


    Roberto Oliveira www.roberto.inf.br @roberto084

    terça-feira, 8 de maio de 2012 19:16
  • Olá Roberto,

    Desde já agradeço sua atenção. Copiei seu código, mas a função ConsultarMenu está dando erro pois não encontra-se no exemplo que você postou, será que seria possível postar esta função?

    Obrigado!

    sexta-feira, 11 de maio de 2012 13:47
  • Então, a função ConsultarMenu() é uma função que você deve criar para recuperar os registros da tabela de Menu.

    Um Exemplo é:

    private List<Menu> ConsultarMenu()
            {
                    SqlConnection conn = new SqlConnection("Data Source=JF;Initial Catalog=teste;Integrated Security=True");
                    string sql = "SELECT Nome FROM TB_MENU";
                    
                    conn.Open();
                    SqlCommand comando = new SqlCommand(sql,conn);
                    SqlDataReader dados = comando.ExecuteReader();
                    List<Menu> lstMenu = new List<Menu>(); 
                    lstMenu = dados;
    
                    conn.Close();
    
            }

    Lembrando que esse código É UM EXEMPLO E NÃO VAI FUNCIONAR... 

    Abraços,


    Roberto Oliveira www.roberto.inf.br @roberto084

    segunda-feira, 14 de maio de 2012 15:12
  • Fiz um estes tempos que tem também imagem, tooltip do menu, etc...

    string sql = "SELECT * FROM usuariosmenus WHERE idusuario=?idusuario AND ativo='1' ORDER BY idpai;";
                Dictionary<string, string> parametros = new Dictionary<string, string>();
                parametros.Add("?idusuario", idusuario.ToString());
                DataTable dt = dados.getDataTable(sql, parametros); // DataTable com os dados do menu desse usuário
                int registros = dt.Rows.Count;
                // Se tiver algum registro (algum menu)
                if (registros > 0) {
                   m.Items.Clear(); // remove registro de erro e alerta...
                   // O SELECT tras os registros com idpai=0 primeiro, assim serão incluídos os pais!
                   for (int i = 0; i < registros; i++) {
                      // 0 é menu ROOT (raiz), por isso, é iniciado como -1
                      int idPaiSelecionado = -1;
                      // Pega ID do pai deste item do loop
                      string strPai = dt.Rows[i]["idpai"].ToString();
                      // Caso não consiga converter idpai recuperado, ou seu valor não esteja correto, sai do loop (próximo menu será verif.)
                      if (!int.TryParse(strPai, out idPaiSelecionado)) break;
                      // Somente se for MENU raiz
                      if (idPaiSelecionado == 0) {
                         // Pega os dados do MENU
                         string _idpai = dt.Rows[i]["idpai"].ToString();
                         string _idmenu = dt.Rows[i]["idmenu"].ToString();
                         string _url = dt.Rows[i]["url"].ToString();
                         string _menu = dt.Rows[i]["menu"].ToString();
                         string _tooltip = dt.Rows[i]["tooltip"].ToString();
                         string _ativo = dt.Rows[i]["ativo"].ToString();
                         string _icone = dt.Rows[i]["icone"].ToString();
                         // Cria objeto Menu com os dados atribuidos
                         MenuItem item = new MenuItem(_menu, _idmenu, _icone, _url);
                         item.ToolTip = _tooltip; // Dica do menu (caso o mouse fique parado em cima.
                         // Percorre todos os registros para encontrar os submenus desse menu.                     
                         for (int x = i + 1; x < registros; x++) {
                            if (_idmenu.Equals(dt.Rows[x]["idpai"].ToString())) {
                               string xidmenu = dt.Rows[x]["idmenu"].ToString();
                               string xidpai = dt.Rows[x]["idpai"].ToString();
                               string xurl = dt.Rows[x]["url"].ToString();
                               string xmenu = dt.Rows[x]["menu"].ToString();
                               string xtooltip = dt.Rows[x]["tooltip"].ToString();
                               string xativo = dt.Rows[x]["ativo"].ToString();
                               string xicone = dt.Rows[x]["icone"].ToString();
                               // adiciona submenu no menu raiz
                               item.ChildItems.Add(new MenuItem(xmenu, xidmenu, xicone, xurl));
                            }
                         }
                         m.Items.Add(item);
                      }
                   }

    Bom, um pouco prolixo, mas diferente!

    Obs: Estava me esquecendo, por uma razão particular, não estávamos usando MVC e sim 3 camadas (DAL, BLL, VIEW) e por razões de performance e detalhes era obrigatório o uso de um DataTable e não DataReader, List<Class>, etc.


    É ajudando os outros que nos ajudamos...


    • Editado Terra Jr quinta-feira, 17 de maio de 2012 01:33
    quinta-feira, 17 de maio de 2012 01:30