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

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 SubSe alguém tiver outra forma para montar este menu, por favor, postem aqui.
Grato,
Ilano
Todas as Respostas
-
-
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
- Sugerido como Resposta Roberto L Oliveira segunda-feira, 14 de maio de 2012 18:54
-
-
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
-
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