[... 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í???).