Jump to content

Archived

This topic is now archived and is closed to further replies.

RSS iMasters

Montando menu dinâmico com Banco de Dados - Parte Final

Recommended Posts

Olá, pessoal, no último artigo iniciamos um passo a passo para montar um menu dinâmico com banco de dados. Hoje vamos finalizar o exercício, que tem como objetivo ajudar a facilitar o desenvolvimento dessa solução web, que é bastante utilizada. Todo aplicativo dinâmico e com diferenciação de usuário necessita de um menu diferenciado ou de acordo com cada perfil do usuário.

 

Referência:

 

  • Ferramenta: Visual Studio .NET 2008
  • Linguagem: C#.NET
  • Banco de dados: SQL Server 2008 (mas pode ser feito em qualquer banco)
  • Componente web usado: ASP:MENU

Não deixe de ler o artigo anterior, para evitar que você tenha problemas no momento da codificação, que vamos falar nessa ultima parte.

 

 

Codificação

O primeiro passo é a parte HTML do menu. Dentro da página .aspx eu coloquei o componente menu da própria ferramenta Visual Studio .NET 2008. Coloquei também alguns Css e cores específicas:

 

<asp:Menu ID="MenuSistema" runat="server" DisappearAfter="4000" EnableTheming="false"

                            Orientation="Horizontal" Height="44px" Font-Names="Arial" Font-Bold="true">

                            <StaticMenuItemStyle ForeColor="#02587b" HorizontalPadding="10px" Height="28px" BorderWidth="1px"

                                BorderColor="Transparent" Font-Size="11pt" />

                            <StaticHoverStyle BackColor="Transparent" CssClass="staticHoverStyle" ForeColor="#444444"

                                BorderColor="#f8f8f8" BorderWidth="1px" />

                            <StaticSelectedStyle BackColor="#d4d4d4" ForeColor="#444444" BorderColor="Transparent"

                                BorderWidth="1px" />

                            <DynamicMenuStyle BackColor="#f5f5f5" BorderColor="#b4b4b4" BorderWidth="1px" />

                            <DynamicMenuItemStyle Height="28px" HorizontalPadding="15px" Width="100%" Font-Size="10pt"

                                ForeColor="#666666" Font-Bold="false" />

                            <DynamicHoverStyle ForeColor="#ffffff" CssClass="dynamicHoverStyle" BackColor="Transparent" />

                        </asp:Menu>Code 1

 

Não é necessário usar CSS ou cor para o menu, coloquei para ficar mais bonito e para o usuário final gostar.. O importante neste código é colocar o atributo DisappearAfter=?4000? e o EnableTheming=?false?.

 

Note também o id do objeto da tela, vou utilizar este mesmo nome: Id=?MenuSistema?.

 

No artigo anterior descrevi como preencher a sessão do menu com o select no banco de dados. Com a sessão preenchida fica fácil montar o menu. Existem alguns métodos específicos para montar o pai e o filho.

 

 

Código Load da Página

Depois de o usuário logar no aplicativo e carregar a sessão de menu, na página principal ou dentro da masterpage (que é o meu caso), eu verifico a sessão e os demais campos vindos do banco de dados.

 

protected string Link = "";

if (Sessao.Menu != null)

{

DataTable ItensMenu = DataTableUtil.FilterDataTable(Sessao.Menu, "ItemSeguranca=false");

foreach (DataRow ItemMenu in ItensMenu.Rows)

{

if (!Convert.ToBoolean(ItemMenu["IndicadorAbertura"]))

{

Link = ItemMenu["Endereco"].ToString();

}

else

{

Link = "javascript:abreJanela('" + ItemMenu["Endereco"].ToString() + "')";

}

 

MenuItem menu = new MenuItem(ItemMenu["Descricao"].ToString(), ItemMenu["ObjetoId"].ToString(), "", Link);

if (ItemMenu["ObjetoPaiId"].ToString().Equals(""))

{

MenuSistema.Items.Add(menu);

AddSubMenuItem(menu, Sessao.Menu);

}

}

 

MenuItem menuSair = new MenuItem("Sair", "Sair", "", "Logout.aspx");

MenuSistema.Items.Add(menuSair);

}Code 2

 

A primeira linha verifica se a Sessao.Menu é diferente de null. Se for, eu faço um filtro para o item de segurança igual a false. O passo seguinte é fazer um foreach do item menu, que é do tipo DataRow nos ItensMenu.Rows retornados do filtro.

 

Dentro do for, verifico com o if se o campo do banco de dados chamado IndicadorAbertura é false, aí eu atribuo o ItemMenu com o campo Endereco à variável Link, senão eu coloco para abrir a função em javascript passando o parâmetro para abrir popup.

 

MenuItem menu = new MenuItem(ItemMenu["Descricao"].ToString(), ItemMenu["ObjetoId"].ToString(), "", Link);

 

if (ItemMenu["ObjetoPaiId"].ToString().Equals(""))

{

MenuSistema.Items.Add(menu);

AddSubMenuItem(menu, Sessao.Menu);

}Code 3

 

Continuando, o code 3 está contido no code 2. Para adicionar o menu, gerei uma nova instância do MenuItem passando a ?Descricao", ?ObjetoId? e o Link. O passo seguinte é verificar com um if se o campo ObjetoPaiId é igual a nada, se for eu adiciono no MenuSistema (que é o id do objeto da tela) passando a variável menu e depois chamo outro método chamado AddSubMenuItem(menu, Sessao.Menu).

 

protected void AddSubMenuItem(MenuItem MenuPai, DataTable dtMenu)

{

foreach (DataRow ItemMenu in dtMenu.Rows)

{

if (MenuPai.Value.ToString().Equals(ItemMenu["ObjetoPaiId"].ToString()))

{

if (!Convert.ToBoolean(ItemMenu["IndicadorAbertura"]))

{

Link = ItemMenu["Endereco"].ToString();

}

else

{

Link = "javascript:abreJanela('" + ItemMenu["Endereco"].ToString() + "')";

}

 

MenuItem menu = new MenuItem(ItemMenu["Descricao"].ToString(), ItemMenu["ObjetoId"].ToString(), "", Link);

MenuPai.ChildItems.Add(menu);

AddSubMenuItem(menu, Sessao.Menu);

}

}

}Code 4

 

O code 4 mostra especificamente o método AddSubMenuItem, que é responsável por adicionar um submenu dentro de um menu principal. É necessário passar o MenuItem e a Sessao.Menu (DataTable).

 

Dentro dele faço um for seguindo o mesmo procedimento feito no menu anterior. No final do método, exatamente na última linha, eu chamo o mesmo método passando os dados.

 

Você pode usar um skin para atribuir um layout legal, css, imagens e tudo mais.  Lembre-se que para preencher o menu de acordo com o usuário é necessário passar o id do usuário logado e fazer o select mostrado no artigo anterior. Veja o código de como atribuir valor para a sessão:

 

Sessao.Menu = new ObjetoBRL().BuscaMenuDoUsuario(Sessao.UsuarioId);Code 5

 

É bem simples e fácil depois que já tenho o banco de dados. Segue a minha página completa para que tenha uma noção. Veja o Code 6 (Principal.master)

 

using System;

using System.Data;

using System.Configuration;

using System.Collections;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Web.UI.HtmlControls;

 

public partial class MeuAplicativo : System.Web.UI.MasterPage

{

protected string Link = "";

 

protected void Page_Load(object sender, EventArgs e)

{

if (!Sessao.UsuarioLogado || Sessao.UsuarioId.Equals(0))

{

Response.Redirect("Default.aspx");

}

if (!IsPostBack)

{

if (Sessao.Menu != null)

{

DataTable ItensMenu = DataTableUtil.FilterDataTable(Sessao.Menu, "ItemSeguranca=false");

foreach (DataRow ItemMenu in ItensMenu.Rows)

{

if (!Convert.ToBoolean(ItemMenu["IndicadorAbertura"]))

{

Link = ItemMenu["Endereco"].ToString();

}

else

{

Link = "javascript:abreJanela('" + ItemMenu["Endereco"].ToString() + "')";

}

 

MenuItem menu = new MenuItem(ItemMenu["Descricao"].ToString(), ItemMenu["ObjetoId"].ToString(), "", Link);

if (ItemMenu["ObjetoPaiId"].ToString().Equals(""))

{

MenuSistema.Items.Add(menu);

AddSubMenuItem(menu, Sessao.Menu);

}

}

 

MenuItem menuSair = new MenuItem("Sair", "Sair", "", "Logout.aspx");

MenuSistema.Items.Add(menuSair);

}

}

}

 

protected void AddSubMenuItem(MenuItem MenuPai, DataTable dtMenu)

{

foreach (DataRow ItemMenu in dtMenu.Rows)

{

if (MenuPai.Value.ToString().Equals(ItemMenu["ObjetoPaiId"].ToString()))

{

if (!Convert.ToBoolean(ItemMenu["IndicadorAbertura"]))

{

Link = ItemMenu["Endereco"].ToString();

}

else

{

Link = "javascript:abreJanela('" + ItemMenu["Endereco"].ToString() + "')";

}

 

MenuItem menu = new MenuItem(ItemMenu["Descricao"].ToString(), ItemMenu["ObjetoId"].ToString(), "", Link);

MenuPai.ChildItems.Add(menu);

AddSubMenuItem(menu, Sessao.Menu);

}

}

}

}Code 6

 

Depois da masterpage criada, basta criar a página .aspx como por exemplo (default.aspx) e indicar a master page do projeto. O resultado final é o menu montado:

 

32998.png

 

Bom, fico por aqui e espero que você tenha gostado. Qualquer dúvida é só entrar em contato.

 

avw.php?zoneid=14&n=a32a0e94

 

http://imasters.com.br/artigo/19627/sql-server/montando-menu-dinamico-com-banco-de-dados-parte-final/

Share this post


Link to post
Share on other sites

po cara bem bacana mas acho que ficaria melhor se você colocase os codigos no code po xD fica mais facil de ler seilá

bota seus codigos assim  :joia: 

:joia: :joia: :joia: :joia: :clap: :clap: :clap: :joia: :joia: :joia:

Share this post


Link to post
Share on other sites

×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.