Ver Mensaje Individual
  #6 (permalink)  
Antiguo 24/07/2007, 01:19
Avatar de zacktagnan
zacktagnan
 
Fecha de Ingreso: abril-2005
Mensajes: 501
Antigüedad: 19 años, 10 meses
Puntos: 3
Re: Construir una lista dinámicamente

[... VIENE DEL ANTERIOR MENSAJE ...]


[*] en el .aspx.cs
Código:
using System;
using System.Data;
using System.Data.SqlClient;
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 Default : System.Web.UI.Page
{
    //ESTABLECIENDO CONEXIÓN
    SqlConnection cnDatos = new SqlConnection("server=NOMBRE_SERVIDOR;database=NOMBRE_BASEdeDATOS;uid=sa;");
    DataTable dtMenuItems = new DataTable();
    string elMenu = "";
    string subMenus = "";
    int total_TOTSubniv = 0;

    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected string construirMenu()
    {
        elMenu = "<ul>";
        //RECOGIENDO LOS DATOS DE LA BASE DE DATOS
        //==========================================
        //INVOCANDO AL PROCEDIMIENTO ALMACENADO
        SqlDataAdapter daMenu = new SqlDataAdapter("ObtenerOpciones_Menu", cnDatos);
        daMenu.SelectCommand.CommandType = CommandType.StoredProcedure;
        //LLENANDO EL DataTable
        daMenu.Fill(dtMenuItems);
        //RECORRIENDO EL DataTable PARA AGREGAR LOS ELEMENTOS QUE ESTARÁN EN LA CABECERA DEL MENÚ
        foreach (DataRow drMenuItem in dtMenuItems.Rows)
        {
            haySubmenus(drMenuItem["mnu_id"].ToString());
            if (total_TOTSubniv > 0)
            {
                //HABIENDO SUBMENÚS
                //ESTA CONDICION INDICA QUE SON ELEMENTOS PADRE
                if (drMenuItem["mnu_id"].ToString() == drMenuItem["mnu_padre_id"].ToString())
                {
                    elMenu = elMenu + "<li><a href=\"" + drMenuItem["mnu_url"].ToString() + "\">" + (drMenuItem["mnu_txt"].ToString()).ToUpper() + "<!--[if IE 7]><!--></a><!--<![endif]--><!--[if lte IE 6]><table><tr><td><![endif]-->";
                    obtenSubmenus(drMenuItem["mnu_id"].ToString());
                    elMenu = elMenu + "<!--[if lte IE 6]></td></tr></table></a><![endif]--></li>";
                }
            }
            else
            {
                //NO HABIENDO SUBMENÚS
                //ESTA CONDICION INDICA QUE SON ELEMENTOS PADRE
                if (drMenuItem["mnu_id"].ToString() == drMenuItem["mnu_padre_id"].ToString())
                {
                    elMenu = elMenu + "<li><a href=\"" + drMenuItem["mnu_url"].ToString() + "\">" + drMenuItem["mnu_txt"].ToString().ToUpper() + "</a></li>";
                }
            }
        }
        elMenu = elMenu + "</ul>";
        return elMenu;
    }

    protected int haySubmenus(string menuId)
    {
        string sql_TOTSubniv = "SELECT COUNT(mnu_id) FROM MENU WHERE mnu_padre_id=" + menuId + " AND mnu_id<>" + menuId + "";
        SqlCommand coman_TOTSubniv = new SqlCommand(sql_TOTSubniv, cnDatos);
        
        try
        {
            cnDatos.Open();
            //RECOGIENDO EL RESULTADO DEL COUNT(mnu_id)
            total_TOTSubniv = int.Parse(coman_TOTSubniv.ExecuteScalar().ToString());
            cnDatos.Close();
        }
        catch (SqlException ex_TOTSubniv)
        {
            Response.Write("Se ha producido un error: " + ex_TOTSubniv);
        }

        return total_TOTSubniv;
    }//FIN DE haySubmenus(...)

    protected string obtenSubmenus(string menuId)
    {
        DataTable dtSubMenus = new DataTable();
        SqlDataAdapter daSubMenus = new SqlDataAdapter("SELECT * FROM MENU WHERE mnu_padre_id=" + menuId + " AND mnu_id<>" + menuId + " ORDER BY mnu_posicion, mnu_txt", cnDatos);
        //LLENANDO EL DataTable
        daSubMenus.Fill(dtSubMenus);
        try
        {
            ////cnDatos.Open();
            elMenu = elMenu + "<ul>";
            foreach (DataRow drSubMenus in dtSubMenus.Rows)
            {
                haySubmenus(drSubMenus["mnu_id"].ToString());
                if (total_TOTSubniv > 0)
                {
                    elMenu = elMenu + "<li><a class=\"drop\" href=\"" + drSubMenus["mnu_url"].ToString() + "\" title=\"" + drSubMenus["mnu_txt"].ToString() + "\">" + drSubMenus["mnu_txt"].ToString() + "<!--[if IE 7]><!--></a><!--<![endif]--><!--[if lte IE 6]><table><tr><td><![endif]-->";
                    obtenSubmenus(drSubMenus["mnu_id"].ToString());
                    elMenu = elMenu + "<!--[if lte IE 6]></td></tr></table></a><![endif]--></li>";
                }
                else
                {
                    elMenu = elMenu + "<li><a href=\"" + drSubMenus["mnu_url"].ToString() + "\" title=\"" + drSubMenus["mnu_txt"].ToString() + "\">" + drSubMenus["mnu_txt"].ToString() + "</a></li>";
                }
            }
            elMenu = elMenu + "</ul>";
            ////cnDatos.Close();
        }
        catch (SqlException ex_TOTSubniv)
        {
            Response.Write("Se ha producido un error: " + ex_TOTSubniv);
        }

        return subMenus;
    }//FIN DE obtenSubmenus(...)
}
[*] el procedimiento almacenado [ObtenerOpciones_Menu]
Código:
CREATE PROCEDURE [ObtenerOpciones_Menu]
AS
	SET NOCOUNT ON
		SELECT *
		FROM MENU
		ORDER BY mnu_posicion, mnu_txt

	SET NOCOUNT OFF
go
y la tabla MENU está creada con estos campos
Código:
 CREATE TABLE MENU (mnu_id INT IDENTITY (1,1) NOT NULL,
 mnu_txt NVARCHAR(50) NOT NULL,
 mnu_title NVARCHAR(50) NULL,
 mnu_padre_id INT NOT NULL CONSTRAINT DF_menu_mnu_padre_id DEFAULT ((0)),
 mnu_posicion TINYINT NOT NULL,
 mnu_url NVARCHAR(50) NOT NULL CONSTRAINT DF_menu_mnu_url DEFAULT (('#')),
 mnu_perfiles NVARCHAR(25) NOT NULL,
 CONSTRAINT clave_menu PRIMARY KEY (mnu_id))
Pues eso, si a alguien le puede hacer falta algo parecido, ya tiene un ejemplo de como hacerlo

No obstante, me interesaría se me aclarara la propuesta de kornissues12, así como lo de cerrar ó no la conexión en ciertas partes dentro de los try ... catch (es mejor cerrarlas ó no importa mucho dejarlas así???).
__________________
Saludos,

zacktagnan.
=================================================