Lista de Artículos Inicio
- Año II  






Creando Menús Dinámicos con ASP .NET 2.0
Descargar Codigo Fuente

Ivan Mostacero Plasencia

MCP MCSD for Microsoft .NET
MCAD for Microsoft .NET
Early Achiever in .NET Technologies
Asegurador de calidad - COFIDE

informatizate(at)informatizate(dot)net
Setiembre 28 del 2004.


Para desarrollar una aplicación Web, no solo es necesario cumplir con la lógica de negocios que el sistema debe implementar, mucho más si esta aplicación va a estar colgada sobre Internet y en donde nuestros socios de negocios van a poder observar la calidad y vistosidad de la misma. También es necesario darle un valor agregado en cuanto a la amigabilidad frente a nuestros usuarios finales, a la facilidad de uso y navegabilidad de sus contenidos.

Una de las partes mas importantes de nuestra aplicación Web es sin duda alguna el Menú ya que será la parte con la que mas interactuaran nuestros usuarios, dada la importancia que acabamos de definir para esta parte de una aplicacion, los desarrolladores generalmente recurrimos a Controles de externos y muchas veces controles por los que se debe pagar cierta cantidad de dinero.

Ahora con la liberación de Visual Studio 2005 y el Framework 2.0 versión beta, trae consigo un control denominado Menu que es el que usaremos ahora para desarrollar un ejemplo de como poder cargar dinámicamente desde la base de datos, toda una estructura de menús de acuerdo a lo que se requiera publicar en la Web.


Base de Datos

Para iniciar este ejemplo primero debemos crear una tabla en la base de datos de SQL Server que pueda contener a todas las opciones que va a presentar nuestro menu, ahora como vamos a tener varios ítems del menú, además un ítem del menú a la vez puede contener varios SubItems y asi sucesivamente, esto nos hace pensar en una tabla estructurada de tal forma que se pueda generar una estructura jerarquica a partir de los datos que contenga y de las relaciones entre estos datos, lo que conlleva a generar una tabla que se relaciona a si misma, en donde además de generar un código para cada elemento se debe definir además un código del padre a quien pertenece ese elemento.

La estructura de la tabla quedaría de la siguiente manera:



MenuId. Es el código que va a tener cada Ítem de Menú.
Descripción. Descripción que aparecerá en el Menú.
PadreId. Es el código del Ítem de Menú de quien es hijo cada registro, en el caso de uno de los elementos de nivel superior (root), este código seria el mismo que MenuId.
Posición. Es la posición que va a tener en el árbol que se genere para cada ítem, por ejemplo si es el primer hijo tendrá posición 1, si es el segundo posición 2 y así sucesivamente. Icono. Imagen que estará a la izquierda de la descripción del Ítem.
Habilitado. Indica si un determinado Ítem esta habilitado para mostrarse.
Url. La url a la que se redireccionará nuestra Web en caso de dar click en el ítem.
FechaCreacion. Fecha en que se ha creado este Ítem ( para auditoria).
UsuarioCreacion. Usuario que ha creado este Ítem ( para auditoria).
FechaModificacion. Ultima fecha en que se ha modificado este Ítem ( para auditoria).
UsuarioModificacion. Ultimo usuario que ha modificado este Ítem ( para auditoria). De esta manera hemos definido nuestra tabla que se encargara de almacenar la información necesaria para el funcionamiento de nuestro ejemplo, luego de esto lo que necesitamos es definir un procedimiento almacenado que nos pueda proveer la información que se requiere para mostrar nuestro menú dinámico, en nuestro caso será un procedimiento sencillo que nos listara todos los ítems que están Habilitados para mostrarse, además ordenándolos por la Posición para de esta manera se muestren ordenados nuestros elementos del menú sin necesidad de agregar ninguna logica adicional.

El Procedimiento almacenado quedaría de la siguiente manera:


CREATE PROCEDURE dbo.ObtenerOpcionesMenu
AS

SET NOCOUNT ON

SELECT MenuId, Descripcion, Posicion, PadreId, Icono, Habilitado, Url
FROM dbo.Menu
WHERE Habilitado = 1

SET NOCOUNT OFF
Figura 2. Procedimiento Almacenado.


Presentación

Luego de ya tener el Procedimiento almacenado, pasamos a crear el Web site, para esto primero cargamos nuestro Visual Studio .NET 2005, y vamos a File , New Web site y creamos nuestro proyecto Web denominado menuDemo tal como se muestra en la siguiente figura. ahi podemos notar los diferentes tipos de proyectos existentes solo para crear sitios web, en esta version se ha separado la creacion de webs con los otros tipos de proyectos existentes.



Luego de crear nuestro Web Site por defecto se agrega un formulario Web denominado Default.aspx sobre el cual agregaremos nuestro Menú, para esto vamos a la caja de herramientas de Visual Studio donde encontraremos un conjunto de separadores o Tabs, en ese conjunto de controles buscamos el tab denominado Navigation y dentro de el encontraremos a nuestro control Menu, lo seleccionamos y arrastramos sobre el diseñador de la pagina, le ponemos por Name mnuPrincipal.




La presentación inicial del menú es muy pobre en cuanto a colores, esto lo notaran al momento en q este ya se encuentre sobre el formulario , desde luego que podríamos elegir darle un auto formato como se puede hacer con controles como el calendario o la grilla, para esto se selecciona el menú en el diseñador, se da botón secundario , se elige Auto Format... y se puede elegir entre varios formatos ya definidos, o desde luego se puede personalizar de la manera que a nosotros nos parezca conveniente, puede ser de acuerdo a los colores que son el estándar de la empresa para la que estamos desarrollando el aplicativo Web.

Ahora pasemos a la parte mas fundamental de este ejemplo, que es la carga dinámica de los diferentes ítems que tendrá nuestra aplicación en base a jerarquías definidas en la base de datos. lo primero que debemos hacer es conectarnos a la base de datos para poder invocar el procedimiento almacenado que antes definimos, luego de eso pasaremos a llenar el menú de una forma recursiva ya que así lo definimos en base de datos, el código necesario con sus respectivos comentarios seria el siguiente:

Imports System.Data
Imports System.Data.SqlClient

Partial Class Default_aspx  

Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    If Not Page.IsPostBack Then

          'Traemos los datos de de datos.
          Dim dtMenuItems As New DataTable

          'Conexion a la base de datos donde esta nuestra tabla Menú.
          Dim cnDatos As New SqlConnection("server=localhost;DataBase=DBApp;Integrated Security=SSPI;")

          'se invoca al procedimiento almacenado
          Dim daMenu As New SqlDataAdapter("ObtenerOpcionesMenu", cnDatos)
          daMenu.SelectCommand.CommandType = CommandType.StoredProcedure

          'llenamos el datatable
          daMenu.Fill(dtMenuItems)

         'recorremos el datatable para agregar los elementos de que estaran en la cabecera del menú.
          For Each drMenuItem As Data.DataRow In dtMenuItems.Rows

               'esta condicion indica q son elementos padre.
               If drMenuItem("MenuId").Equals(drMenuItem("PadreId")) Then
                    Dim mnuMenuItem As New MenuItem
                    mnuMenuItem.Value = drMenuItem("MenuId").ToString
                    mnuMenuItem.Text = drMenuItem("descripcion").ToString
                    mnuMenuItem.ImageUrl = drMenuItem("Icono").ToString
                    mnuMenuItem.NavigateUrl = drMenuItem("Url").ToString

                    'agregamos el Ítem al menú
                     mnuPrincipal.Items.Add(mnuMenuItem)

                    'hacemos un llamado al metodo recursivo encargado de generar el árbol del menú.
                    AddMenuItem(mnuMenuItem, dtMenuItems)
                End If
          Next
     End If

End Sub

Private Sub AddMenuItem(ByRef mnuMenuItem As MenuItem, ByVal dtMenuItems As Data.DataTable)

    'recorremos cada elemento del datatable para poder determinar cuales son elementos hijos
    'del menuitem dado pasado como parametro ByRef.
    For Each drMenuItem As Data.DataRow In dtMenuItems.Rows
        If drMenuItem("PadreId").ToString.Equals(mnuMenuItem.Value) AndAlso _
        Not drMenuItem("MenuId").Equals(drMenuItem("PadreId")) Then
            Dim mnuNewMenuItem As New MenuItem  
            mnuNewMenuItem.Value = drMenuItem("MenuId").ToString
            mnuNewMenuItem.Text = drMenuItem("descripcion").ToString
            mnuNewMenuItem.ImageUrl = drMenuItem("Icono").ToString
            mnuNewMenuItem.NavigateUrl = drMenuItem("Url").ToString

            'Agregamos el Nuevo MenuItem al MenuItem que viene de un nivel superior.
            mnuMenuItem.ChildItems.Add(mnuNewMenuItem)

            'llamada recursiva para ver si el nuevo menú ítem aun tiene elementos hijos.
            AddMenuItem(mnuNewMenuItem, dtMenuItems)
        End If
    Next

End Sub

End Class




Ahora ya implementado el método recursivo encargado de generar el menú, de acuerdo a la información almacenada en base de datos que mostrare en la figura siguiente, podríamos tener un menú de la siguiente manera:

Claro que si observamos bien notaremos que no es nada llamativo, ahora si vamos a proceder a ponerle los colores adecuados, con los anchos apropiados también, además de darle una presentación horizontal, en la cabecera de nuestra pagina, es muy recomendable que nuestro Menú vaya en una Master Page en donde se ubiquen los métodos que se encarguen de generarlo, y cada una de las Paginas de Contenido (Content Pages) deben tener la estructura de la misma Master Page para así guardar uniformidad en todas las paginas de la aplicación. Pasamos ahora a aplicar ciertos formatos a nuestro menú, el cual quedaría con el siguiente código HTML:


<asp:Menu ID="mnuPrincipal" MaximumDynamicDisplayLevels ="2" Runat="server" Height="20px" Orientation="Horizontal" BackColor="#b1c3d9" ForeColor="#336699" Font-Names="Verdana" Font-Size="11px" StaticSubMenuIndent="" DynamicHorizontalOffset="2" Font-Bold = "true" BorderStyle="Solid" BorderColor="#336699" BorderWidth="1px">
    <DynamicMenuStyle BackColor="#B1C3D9" BorderWidth="1px" BorderColor="#336699" Width="180px"/>
    <DynamicMenuItemStyle HorizontalPadding="5" VerticalPadding="2" />
    <DynamicHoverStyle ForeColor="White" Font-Bold="True" BackColor="#336699"/>
    <StaticMenuStyle BackColor="#B1C3D9" BorderWidth="1px" BorderColor="#336699"/>
    <StaticMenuItemStyle HorizontalPadding="5" VerticalPadding="2" Width="180px"/>
    <StaticHoverStyle ForeColor="White" Font-Bold="True" BackColor="#336699"/>
</asp:Menu>


Como podemos ver el menú se ha modificado para que tenga una mejor presentación, cada una de las propiedades definidas dentro del tag tienen una función especial de las cuales tenemos a MaximunDynamicDisplayLevels que viene a ser el numero máximo de subniveles permitidos para el menú y la propiedad Orientation podría ser horizontal o vertical. Ahora los tags dentro del menú están formados por dos grupos bien definidos, los que inician con Static que en si son elementos definidos para los elementos Root o elementos padre y los que inician Dynamic que son características que se aplican a los subitems del menú.

Luego de haber agregado los atributos antes mencionados, la presentación final del menú seria la siguiente.

Conclusiones.

La nueva versión de .NET se viene con muchas novedades bajo el brazo, con controles muy interesantes, de mucha funcionalidad y sobre todo muy fáciles de usar, que con un poco de ingenio nos van a permitir realizar aplicaciones diversas con características de buena performance y a la vez de navegabilidad y presentación al usuario final. El nuevo control Menú es uno de estos controles que encierra estas características y que da un valor agregado al trabajo que estemos realizando, evitando tener que estar preocupándonos por ir a la Internet y buscar controles de terceros que son complicados de utilizar o que implican un alto coste el adquirirlos.


   

Otros Artículos del Autor: Fecha Publicación:
Implementacion de Callback usando ASP.NET 2.0 Agosto 23 del 2004


Google




Copyright © 2002-2004 Grupo Informatizate. Reservados todos los derechos.
Prohibida la reproducción total o parcial en cualquier formato sin previa autorización.
On-line desde el 27 de Noviembre del 2002