![]() |
Construir una lista dinámicamente Hola a tod@s: Estoy trabajando en un Sitio Web en ASP.NET 2.0 con código C# Quisiera montar la siguiente lista de manera dinámica:
Todos los datos para montar vienen de una tabla [MENU] de la base de datos con esta estructura: Código: CREATE TABLE MENU (mnu_id INT IDENTITY (1,1) NOT NULL,- [mnu_txt] es el texto de la opción. - [mnu_title] es el texto para la propiedad TITLE de la etiqueta A de vínculo (pues cada opción va vinculada a alguna página). - [mnu_url] es la ruta al vínculo deseado. - [mnu_nivel] es un número indicador del nivel/subnivel en la que la opción se sitúa en la lista; por ejemplo las opciones como [FICHEROS MAESTROS] están a un nivel 0, una opción por debajo de ésta tendrá el nivel 1, debajo de ésta el nivel 2, etc... - [mnu_padre_id], es el número para indicar cuál es el nivel padre de cada submenú. Las opciones de primer nivel, es decir nivel 0, no tienen padre y en este caso llevarán un 0 en este campo; los demás si son subniveles de otros llevarán en este campo el ID de los que sean sus padres, por ejemplo, la opción [Clientes] debajo de [Ficheros Maestros] lleva el 1 en este campo. Como he dicho, quisiera saber como construir la lista deseada a través de los datos de la tabla. En ASP 3.0 sabría hacerlo más ó menos a través de combinar varias consultas a la vez con varios recordset... Pero con el ASP.NET 2.0, no llego a ver exactamente la manera, ya que en mi corta experiencia todas las consultas que se construyen se van cargando en controles web como GridView, FormView ó DropDownList. Y aquí, no veo que sea ese el caso a menos que me equivoque Si alguien me puede dar alguna pista sobre como construir la consulta, ... si con un objeto SqlDataSource ó con un SqlDataAdapter y DataSet ó con otros, y luego, sobre todo como ir cargando los datos montando el HTML de listas (ul y li) para conseguir la lista planteada. Al final, esta lista, aplicándole una serie de estilos, se convierte en un menú desplegable. Espero la(s) respuesta(s) de todo el que me pudiera ayudar... |
Re: Construir una lista dinámicamente Bueno, parece que la solución a lo que planteo puede pasar por utilizar el control Menu de Visual Studio 2005. He encontrado un ejemplo aquí: http://www.netveloper.com/contenido2.aspx?IDC=145_0 He bajado el código que está hecho con lenguaje VisualBasic. La página .aspx lleva el control Menu de la siguiente manera: Código: <%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="Default" %>Código: Imports System.DataCódigo: create database DBApp;Código: MenuId | Descripcion | PadreId | Posicion | Icono | Habilitado | Url | FechaCreacion | UsuarioCreacion | FechaModificacion | UsuarioModificacionCódigo: MenuId | Descripcion | PadreId | Posicion | Icono | Habilitado | Url | FechaCreacion | UsuarioCreacion | FechaModificacion | UsuarioModificacionTras construir la base de datos con la tabla necesaria e insertar varias filas, lo he probado. Pasa una cosa, cuánto menos curiosa (igual porque no sé su causa): - si en la tabla Menu solo hay registros que sean elementos de nivel superior (que no sean hijos ó subniveles de otro nivel ó subnivel), entonces funciona. - pero a nada que configure uno de los registros como subnivel de otro, entonces me sale una ventana del WebDev.WebServer.exe con este mensaje: Cita:
¿Hay algún fallo en el código a la hora de construir los submenús ó elmentos hijo, ó en las propiedades de diseño del control Menu empleado? |
Re: Construir una lista dinámicamente ¿Ninguna idea aclaratoria...please? |
Re: Construir una lista dinámicamente Hola he utilizado algun tiempo C# por lo que tengo una idea de como hacer lo que deceas si es que he entendido bien, lo que deceas es que realices una consulta y con el resultado crees el menu con niveles y subniveles, por ello deseas crear un arreglo dinamico, si es asi puedo ayudarte ya que he utilizado mucho los areglos dinamicos, tal vez estas intrucciones te ayuden string[] arreglo = new string[1]; Array.Resize(ref arreglo, arreglo.Length + 1); el primer parametro es la referencia al arreglo y el segundo el nuevo tamaño. espero te sirva. Acerca del error al llenado del menu no sabria mucho al respecto ya que es Visual Basic y el lenguaje no es de mi agrado, es posible que error radique que intenta crear un item del menu en la misma posicion y gerarquia de una ya creado por tanto genera una redundancia y/o sobreescritura. |
Re: Construir una lista dinámicamente Hola kornissues12: La verdad es que no entiendo muy bien lo que me sugieres...Si me pudieras explicar más detalladamente ... Es decir, tu el resultado de la consulta ¿¿la metes como new string en el array string arreglo??? No sé, ... igual estoy diciendo una burrada... Cita:
Lo único que en ciertas partes dónde abro la conexión para cierta consulta no termino de cerrarla pues choca con otra parte abierta ... Bueno la cosa me queda de esta manera: El código que transforma todo en menú y los estilos están sacados del código de uno de los menús de la página CSSPLAY, concretamente este: http://www.cssplay.co.uk/menus/final_drop.html Tras alguna modificación, la hoja de estilos me queda así Código: /*************************************************************************************************/Código: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="Default" %> |
Re: Construir una lista dinámicamente [... VIENE DEL ANTERIOR MENSAJE ...] [*] en el .aspx.cs Código: using System;Código: CREATE PROCEDURE [ObtenerOpciones_Menu]Código: CREATE TABLE MENU (mnu_id INT IDENTITY (1,1) NOT NULL,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í???). |
Re: Construir una lista dinámicamente Bueno creo que te he confundido un poco; ahora bien tienes un error en la apertura de la base por que dentro del "foreach" llamas a la funcion de los menus y dentro de estas abres la base "cnDatos.Open();", por tanto es llamado constantemente una y otra vez, he ahy tu error. puedes corregirlo, primero conviertes en "static" tus variables: static SqlConnection cnDatos = new SqlConnection("server=NOMBRE_SERVIDOR;database=NOM BRE_BASEdeDATOS;uid=sa;"); static DataTable dtMenuItems = new DataTable(); de esta forma el valor de las variables permanecera constante entre funciones. Segundo elimina el "cnDatos.Open();" de tus funciones y colocalo en la siguiente linea: cnDatos.Open(); try { SqlDataAdapter daMenu = new SqlDataAdapter("ObtenerOpciones_Menu", cnDatos); daMenu.SelectCommand.CommandType = CommandType.StoredProcedure; daMenu.Fill(dtMenuItems); foreach (DataRow drMenuItem in dtMenuItems.Rows) { ... } } catch(...) {} finally { cnDatos.Close(); } con esto evitaras el error de apertura. Con respecto al uso de la instruccion de mi mensaje anterior es con otra vision muy diferente a la tuya para el codigo, ya que yo utilizo para ello el objeto menu de asp y lo contruyo dinamicamente, por ejemplo: MenuItem mniTemporal = new MenuItem("Inicio", "Inicio", "", "~/inicio.aspx"); //se crea un menuitem para agregarlo mnuMenu1.Items.Clear(); //solo pa limpiar en caso de tener precargado datos mnuMenu1.Items.AddAt(0,mniTemporal); //se agrega el item en el index 0 mniTemporal = new MenuItem("Servicio", "Servicio", "", "~/servicio.aspx"); // y si se desea agregar un hijo (childitem) mnuMenu1.Items[0].ChildItems.Add(mniTemporal); //en esta intruccion el indice del (Items[X]) debe ser el numero que corresponde al padre //tomando en cuenta que la indexacion comienza en cero Espero esto te ayude. |
Re: Construir una lista dinámicamente Hola de nuevo kornissues12: He hecho lo que dices respecto a cómo abrir y cerrar adecuadamente la conexión y definir las variables SqlConnection cnDatos y DataTable dtMenuItems a static, quitar lo de abrir y cerrar la conexión dentro de las funciones secundarias llamadas dentro de construirMenu(), quedando así: Código: ...Código: protected int haySubmenus(string menuId)En principio, parece que no debería dar problema. Y lo he subido a internet y va. La cosa es que se me ha ocurrido actualizar la página y entonces me duplica el menú. Es decir, por cada actualización de página me construye de nuevo el menú... No sé por qué será está cosa... Total que me ha dado por probar a quitar la definición static de las variables mencionadas, y entonces no me produce ningún error. Código: SqlConnection cnDatos = new SqlConnection("server=NOMBRE_SERVIDOR;database=NOM BRE_BASEdeDATOS;uid=sa;");Respecto a lo otro que explicas, trataré de mirarlo en cuánto tenga algo de tiempo libre. Gracias. |
Re: Construir una lista dinámicamente Hola que bueno que te sirvio, ahora hay un pequeño error bueno no precisamente un erro pero es mucho mejor para el control de errores poner el cnDatos.Open(); dentro del try. Bien ahora lo que sucede es que tu datetable mantiene la tabla anterior por tanto agrega denuevo la tabla cuando llama a la funcion sin borrar la anterior, esto lo puedes arreglar limpiendo la variable: dtMenuItems=null; antes del return, o puedes poner una condicion antes del try por ejemplo: if(!isPostback) { try { ... } } else { return ""; //bueno esto si te genera un error pidiendote un return o return elMenu; //el que te sirva mejor, yo prefiero este ya que refresca el menu } espero te sirva |
Re: Construir una lista dinámicamente De antemano, gracias por seguir respondiendo. Vamos a ver: De primeras he vuelto a poner las variables a static - He querido probar a poner lo del null para el DataTable dtMenuItems de esta forma, como decías antes del return: Código: ...Luego he querido probar lo del try. Según como tu lo planteabas...: Cita:
Entonces yo lo he puesto así, sin else: Código: if(!isPostback)Así, si no hay otra sugerencia, lo dejo como estaba antes de tu último mensaje... Gracias de nuevo. |
Re: Construir una lista dinámicamente Hola y de nada es bueno compartir conocimiento, bueno ya revisando detenidamente puedes colocar un return dentro del primer if, recuerda al final del mismo; asi entre al if o else tendra un return. acerca del datatable, realmente no puede ser null pero puedes vaciar la variable: dtMenuItems = new DataTable(); asi se reinicia la variable, espero que esto te sirva y lamento si te confundi mas lo siento. si deseas puedes contactarme directamente en kornissues12@gmail |
Re: Construir una lista dinámicamente No había puesto eso pero ya había probado a poner un return para el if y para el else Pero bueno pruebo de nuevo así: Código: if(!Page.IsPostBack)Por eso también volví a como estaba antes... |
| La zona horaria es GMT -6. Ahora son las 16:30. |
Desarrollado por vBulletin® Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.