Autor Tema: Crear menu en tiempo de ejecucion...  (Leído 13465 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado llAudioslavell

  • Sv Member
  • ***
  • Mensajes: 126
Crear menu en tiempo de ejecucion...
« : enero 29, 2012, 12:52:28 am »
necesito ayuda para este problema, estoy creando un MenuStrip en tiempo de ejecucion.. las opciones del menu las llamo desde una BD mandandole un parametro "idRol" para que aparescan las opciones para ciertos usuarios Logeados, ejemplo: administrador, secretaria, etc ya que cada uno de los usuarios tendras acceso a distintas opciones, lo quiero hacer primero simple, osea que primero me muestre una opcion.. ya despues lo implementare mas pero primero quiero lo basico .. todo esto usando Programacion Orientada a Objetos.. .. codigo:

Código: [Seleccionar]
Private Sub crearMenu()
        'Almaceno la Clase RN_Usuario en una variable, ubicada en la Capa Negocio
Dim RN_OBJ As New RN_USUARIO
Dim dt As New DataTable
        'Lo almaceno en el Datatable y le mando el parametro "IdRol" para las opciones
Dt = RN_OBJ.RN_MENU_USUARIO(ObjEstructura.IdRol)
        'Bucle que recorrera toda la fila que se encuentre en el Datatable
For Each Filas As DataRow In dt.Rows
                'Instancio un Item para el MenuStrip
Dim menuOpcione As New ToolStripMenuItem
                'Utilizo el campo "NOMBRE_MENU" despues de que el bucle alla recorrido el Datatable
                ' y lo almaceno en un item para el Menu
menuOpcione.Text = CStr(Filas("NOMBRE_MENU").ToString)
                'Instancio el Menu
Dim Menu = New MenuStrip
                'Agrego la opcion que contiene el "NOMBRE_MENU en el Menu
Menu.Items.Add(menuOpcione)
                'esto para que el Menu se muestre en un Panel
panel3.Controls.Add(Menu)
Next
End Sub

Esto,yo supongo que no me deberia dar ningun error pero no es asi =/ ....
"No se controlo  NullReferenceException"
"Referencia a objeto no establecida como instancia de un objeto"
.NET me muestra ese mensaje de error, señalando la linea "For Each Filas As DataRow In dt.Rows" .....
he encontrado varios tutoriales similares a este pero todo en C# .. entendi varias lineas pero no me ayuda a resolver mi problema..
Espero aportes, gracias de antemano..!!
Salu2 !
« Última Modificación: enero 29, 2012, 01:04:53 am por JaiMe »

Desconectado JaiMe

  • Global Moderator
  • The Communiter-
  • *
  • Mensajes: 1485
  • λ | h+
Re: Crear menu en tiempo de ejecucion...
« Respuesta #1 : enero 29, 2012, 01:19:13 am »
No estoy familiarizado con VB, pero esto no me suena bien

Código: [Seleccionar]
Dim Menu = New MenuStrip
Son opcionales los parentesis cuando llamas a un constructor en VB? Si no lo son entonces usa

Código: [Seleccionar]
Dim Menu = New MenuStrip()
Googleando encontre esto

http://bytes.com/topic/visual-basic-net/answers/634263-dynamically-adding-menustrip-its-menuitems-vb-net-2005-a

Tal ves te sea de ayuda.
« Última Modificación: enero 29, 2012, 01:22:16 am por JaiMe »
"Unless you try to do something beyond what you have already mastered, you will never grow."
― Ralph Waldo Emerson

Desconectado edu_guerr

  • Sv Member
  • ***
  • Mensajes: 463
Re: Crear menu en tiempo de ejecucion...
« Respuesta #2 : enero 29, 2012, 03:32:13 pm »
El link que puso @jaime me funciono bien adaptandolo con una conexion a una bd
Googleando encontre esto
http://bytes.com/topic/visual-basic-net/answers/634263-dynamically-adding-menustrip-its-menuitems-vb-net-2005-a

No conozco mucho de vb pero tal vez te sirve la prueba:
Código: [Seleccionar]
           Try
            If obj.conectar() Then
                Dim ds As New DataSet()
                Dim adapter As New SqlDataAdapter("EXEC consulta 'TU USUARIO' ", obj.conec)
                adapter.Fill(ds, "tabla")
                Dim menu As New MenuStrip
                For i As Integer = 0 To (ds.Tables("tabla").Rows.Count() - 1)
                    Dim item As New ToolStripMenuItem(String.Format("Menu Item {0}", ds.Tables("tabla").Rows(i).Item(1)))
                    menu.Items.Add(item)
                Next
                Me.Controls.Add(menu)
            Else : MsgBox("No hay conexión con la base de datos", MsgBoxStyle.Critical, "Sin conexion")
            End If
        Catch ex As SqlException : MsgBox("Error SQL->" + ex.Message)
        Finally : obj.conec.Close()
        End Try

Aqui le coloque el nombre del usuario ya con sus permisos, que tendrian que estar definidos antes de hacer la consulta
Código: [Seleccionar]
       Dim adapter As New SqlDataAdapter("EXEC consulta 'EL USUARIO' ", obj.conec)


Aqui los menus asignados a cada usuario, le puse "item->posicion 1 porque en la consulta en la pocision 0 tengo el nombre del usuario.
Código: [Seleccionar]
   Dim item As New ToolStripMenuItem(String.Format("Menu Item {0}", ds.Tables("tabla").Rows(i).Item(1)))

Suerte.

Desconectado Non Servium

  • Sv Member
  • ***
  • Mensajes: 426
  • Ilix Punx :)
Re: Crear menu en tiempo de ejecucion...
« Respuesta #3 : enero 29, 2012, 05:33:27 pm »
Hola, sé que JaiMe te ha contestado tu pregunta, pero me parece oportuno traerte de recuerdo este tema:
menustrip-dinamico-segun-perfiles-(roles)-de-usuario-con-win-forms-c

Es un post mio y viejo, talvez te ayude con alguna idea!!  :thumbsup:

Saludos :D
♫ Condenados a perder la libertad! Por no acatar las leyes que les asignaron. ♪ ♫
Decididos, decididos a emprender! Un camino largo y duro por no ser esclavos ♫


Watch

Desconectado llAudioslavell

  • Sv Member
  • ***
  • Mensajes: 126
Re: Crear menu en tiempo de ejecucion...
« Respuesta #4 : enero 29, 2012, 07:51:17 pm »
wwoO !! No crei encontrar tanta ayuda.. muchas gracias compaañeros, entre unas horas vere si me funciona.. en este momento ando un poco ocupado...... despues les comento los resultados .. Gracias  !!!

Desconectado llAudioslavell

  • Sv Member
  • ***
  • Mensajes: 126
Re: Crear menu en tiempo de ejecucion...
« Respuesta #5 : enero 30, 2012, 12:08:21 am »
hola a  todos... gracias por tratar de ayudarme ^^ !!! pero hasta ahora no puedo soluccionar ese error =/ .... aqui les dejo la imagen del error:
http://subefotos.com/ver/?76042d210884ac6e01132147aee6c98ex.jpg

no crean que estoy esperando a que ustedes me lo soluccionen...  aun siguo buscando en youtube sobre como crear Menu en tiempo de ejecucion pero hasta ahora no entiendo por que me sigue saliendo el mismo error, sera por que soy novato ... deve ser .....  espero sus apoyos ya que al terminar todo esto pienso hacer un tutorial bien detallado paso a paso  para aportar con la comunidad.... Espero sus apoyos hermanos ^^
Gracias !!!
Salu2

Desconectado Non Servium

  • Sv Member
  • ***
  • Mensajes: 426
  • Ilix Punx :)
Re: Crear menu en tiempo de ejecucion...
« Respuesta #6 : enero 30, 2012, 07:45:07 am »
La imágen no está disponible. Sería mejor nos mostraras un poco de estructura de la BD y una parte del código que te genera problemas y el mensaje de la excepción
♫ Condenados a perder la libertad! Por no acatar las leyes que les asignaron. ♪ ♫
Decididos, decididos a emprender! Un camino largo y duro por no ser esclavos ♫


Watch

Desconectado llAudioslavell

  • Sv Member
  • ***
  • Mensajes: 126
Re: Crear menu en tiempo de ejecucion...
« Respuesta #7 : enero 30, 2012, 08:43:41 am »
La imágen no está disponible. Sería mejor nos mostraras un poco de estructura de la BD y una parte del código que te genera problemas y el mensaje de la excepción

La imagen no esta disponible ??? talves tu navegador lo esta bloqueando..... mm weno hay te va la estructura de mi BD

1-- TABLA MENU
CREATE TABLE [dbo].[MENU](
   ID_MENU INT NOT NULL ,
   [NOMBRE_MENU] NVARCHAR (50) NOT NULL ,
   [PADRE_ID] INT  NULL,
   [ICONOS] NVARCHAR (20) NULL,
   [HABILITADO]  BIT NULL,
   PRIMARY KEY (ID_MENU)
)
GO

PADRE_ID= Es para saver a que opcion pertenecen los submenu.


2-- TABLA ROLES
CREATE TABLE [dbo].[ROLES] (
   ID_ROL INT NOT NULL,
   ROL  NVARCHAR (50) NULL,
   ESTADO BIT,
   PRIMARY KEY (ID_ROL)
)
GO

En esta tabla van todos los roles que exiten en la empresa.

3--TABLA MENUxROLES
CREATE TABLE [dbo].[MENUxROL](
   ID_MENU INT NOT NULL,
   ID_ROL INT,
   FOREIGN KEY (ID_MENU) REFERENCES MENU (ID_MENU),
   FOREIGN KEY (ID_ROL) REFERENCES ROLES (ID_ROL)
)
GO


4---TABLA USUARIO
CREATE TABLE [dbo].[USUARIO](
   [ID_USUARIO] INT IDENTITY(1,1) NOT NULL,   
   USUARIO NVARCHAR (20),
   NOMBRE_USUARIO NVARCHAR (50),
   APELLIDO_USUARIO NVARCHAR (50),
   RUTA_FOTO NVARCHAR (150),
   [CONTRASEÑA] [NVARCHAR] (20),
   ID_ROL INT,
   PRIMARY KEY (ID_USUARIO),
   FOREIGN KEY (ID_ROL) REFERENCES ROLES (ID_ROL)
)
GO

Este es el procedimiento con el que busco todas las pestañas del menu a travez del Parametro @idRol:

CREATE PROCEDURE SP_MENUxROL(
   @idRol INT
)
AS
   SELECT M.ID_MENU, M.NOMBRE_MENU
   FROM MENU M, MENUxROL MR
   WHERE M.ID_MENU = MR.ID_MENU AND MR.ID_ROL = @idRol

Esto me funka normal en SQL  "EXECUTE SP_MENUXROL '1'"  con esto me expulsan todas las pestañas que tiene el usuario con el IdRol "1" ...

Aqui va denuevo la imagen con el Error en .NET:

http://oi43.tinypic.com/r10rd0.jpg

pero como ya les mencione.. yo aun no quiero  que aparescan las subopciones del menu... por ahora solo quiero lago simple para entenderlo perfectamente y despues ya agregarle los eventos y las subopciones...

Gracias ^^ !!!
« Última Modificación: enero 30, 2012, 08:48:27 am por llAudioslavell »

Desconectado Non Servium

  • Sv Member
  • ***
  • Mensajes: 426
  • Ilix Punx :)
Re: Crear menu en tiempo de ejecucion...
« Respuesta #8 : enero 30, 2012, 08:48:27 am »
Ahora si pude ver con este nuevo link



El error posiblemente es por que no le creas columnas al data Table. a la hora del foreach, dt.Rows es Null (o Nothing en Vb)


Con RN_OBJ.RN_MENU_USUARIO(ObjEstructura.IdRol) q haces?
♫ Condenados a perder la libertad! Por no acatar las leyes que les asignaron. ♪ ♫
Decididos, decididos a emprender! Un camino largo y duro por no ser esclavos ♫


Watch

Desconectado llAudioslavell

  • Sv Member
  • ***
  • Mensajes: 126
Re: Crear menu en tiempo de ejecucion...
« Respuesta #9 : enero 30, 2012, 08:52:21 am »

Con RN_OBJ.RN_MENU_USUARIO(ObjEstructura.IdRol) q haces?

Tambien mencione que estoy trabajando con capas osea POO ... mira alli con "ObjEstructura.IdRol" le mando el parametro osea el IdRol para la consulta... eso lo tengo en una estructura... cuando el usuario se logea, el sistema captura  varios datos de el incluido su IdRol ... asi  se save que Id tiene el usuario Logeado...  Por eso necesito terminar esto... prometo un Tutorial Bien Detallado.... pero primero tengo que terminarlo bien echo

Desconectado Non Servium

  • Sv Member
  • ***
  • Mensajes: 426
  • Ilix Punx :)
Re: Crear menu en tiempo de ejecucion...
« Respuesta #10 : enero 30, 2012, 09:02:58 am »
Si te entiendo que hace referencia a una clase llamada RN_USUARIO probablemente externa al proyecto de la capa de vista. ¿Podes pegar el código para revisar mejor? ¿Has comprobado, con un punto de interrupción que dt.Rows es null en ese momento que entra al 'Foreach'?

otra duda, ¿Tu menú tiene simplemente un nivel? o sea, por ejemplo:
|Inicio    |Acerca de    |FAQs (por ejemplo)

o está jerarquizado?
ej:
Archivo               Ayuda
     |_Abrir                |_Buscar
     |     |_Proyecto    |_Acerca de
     |     |_Archivo
     |_Salir

Edit:
Lo siento, ya vi que está con jerarquía (según la tabla MENU). Pero tu código no funcionaría (lo que está dentro el foreach no te crea correctamente el menú. Simplemente tira un menú por registro).

Y si probas usando RN_MENU_USUARIO(ObjEstructura.IdRol, ByRef dt)

y al recibir supongo que deberias hacer algo como

Código: [Seleccionar]
Sub RN_MENU_USUARIO(int rol, ByRef dt As DataTable)
    Dim adp As SqlDataAdapter = New SqlDataAdapter("SP_MENUXROL @id_Rol", New SqlConnection("Data Source=xxx; Initial Catalog=xxx; Uid=xxx; Pwd=xxx;"))
    adp.CommandType = CommandType.StoredProcedure
    adp.Parameters.Add = New SqlParameter("@id_Rol", SqlType.Int32, rol)
    adp.Fill(adp)
    adp.Dispose
End Sub

No estoy seguro que funcione 1ero no uso vb y 2do el SqlDataAdapter tampoco, me acostumbre más a Linq pero con C#
« Última Modificación: enero 30, 2012, 09:17:41 am por bereco190xP »
♫ Condenados a perder la libertad! Por no acatar las leyes que les asignaron. ♪ ♫
Decididos, decididos a emprender! Un camino largo y duro por no ser esclavos ♫


Watch

Desconectado llAudioslavell

  • Sv Member
  • ***
  • Mensajes: 126
Re: Crear menu en tiempo de ejecucion...
« Respuesta #11 : enero 30, 2012, 09:36:43 am »
Si te entiendo que hace referencia a una clase llamada RN_USUARIO probablemente externa al proyecto de la capa de vista. ¿Podes pegar el código para revisar mejor? ¿Has comprobado, con un punto de interrupción que dt.Rows es null en ese momento que entra al 'Foreach'?

otra duda, ¿Tu menú tiene simplemente un nivel? o sea, por ejemplo:
|Inicio    |Acerca de    |FAQs (por ejemplo)

o está jerarquizado?
ej:
Archivo               Ayuda
     |_Abrir                |_Buscar
     |     |_Proyecto    |_Acerca de
     |     |_Archivo
     |_Salir

Edit:
Lo siento, ya vi que está con jerarquía (según la tabla MENU). Pero tu código no funcionaría (lo que está dentro el foreach no te crea correctamente el menú. Simplemente tira un menú por registro).

Y si probas usando RN_MENU_USUARIO(ObjEstructura.IdRol, ByRef dt)

y al recibir supongo que deberias hacer algo como

Código: [Seleccionar]
Sub RN_MENU_USUARIO(int rol, ByRef dt As DataTable)
    Dim adp As SqlDataAdapter = New SqlDataAdapter("SP_MENUXROL @id_Rol", New SqlConnection("Data Source=xxx; Initial Catalog=xxx; Uid=xxx; Pwd=xxx;"))
    adp.CommandType = CommandType.StoredProcedure
    adp.Parameters.Add = New SqlParameter("@id_Rol", SqlType.Int32, rol)
    adp.Fill(adp)
    adp.Dispose
End Sub

No estoy seguro que funcione 1ero no uso vb y 2do el SqlDataAdapter tampoco, me acostumbre más a Linq pero con C#

Probe como me dices con un punto de interrupcion.. ahi te mando la imagen:

http://oi43.tinypic.com/2l9ld90.jpg

y se queda en la linea  "dt = RN_OBJ.RN_MENU_USUARIO(ObjEstructura.IdRol)" o.O !! problemas con el DataTable ?? o con la Jerarquia de mi BD   o.O !!! :shockd: ..... :-/

Mira lo primero que quiero es solo esto:

Archivo      Consultas              Ayuda   

Algo asi .. osea que el Menu no tenga mas Nivel......  o.O  despues ya implementare mas esto.....
estoy haciendo lo correcto ?? .....
     


Desconectado Non Servium

  • Sv Member
  • ***
  • Mensajes: 426
  • Ilix Punx :)
Re: Crear menu en tiempo de ejecucion...
« Respuesta #12 : enero 30, 2012, 09:50:48 am »
Es que te estás equivocando en el método "RN_MENU_USUARIO" ahí te sugerí más o menos como llenar un data table con SqlDataAdapter. Aqui buscando rápido encontré esto: Obtener data Table usando procedimiento almacenado Eso prácticamente debería ir en tu método RN_MENU_USUARIO.

Y por el momento si solo queres menús tipo (Archivo      Consultas              Ayuda   ) si funciona el código que agrega cada registro más o menos así como lo tenés.

Has probado bajar el ejemplo que puse de los menús?? ¬¬ eso es exactamente lo que necesitas

♫ Condenados a perder la libertad! Por no acatar las leyes que les asignaron. ♪ ♫
Decididos, decididos a emprender! Un camino largo y duro por no ser esclavos ♫


Watch

Desconectado llAudioslavell

  • Sv Member
  • ***
  • Mensajes: 126
Re: Crear menu en tiempo de ejecucion...
« Respuesta #13 : enero 30, 2012, 10:31:45 am »
Es que te estás equivocando en el método "RN_MENU_USUARIO" ahí te sugerí más o menos como llenar un data table con SqlDataAdapter. Aqui buscando rápido encontré esto: Obtener data Table usando procedimiento almacenado Eso prácticamente debería ir en tu método RN_MENU_USUARIO.

Y por el momento si solo queres menús tipo (Archivo      Consultas              Ayuda   ) si funciona el código que agrega cada registro más o menos así como lo tenés.

Has probado bajar el ejemplo que puse de los menús?? ¬¬ eso es exactamente lo que necesitas


Hermano..... Ya soluccione mi problema .. en si no era un error solo que me falto una  sintaxis en la Capa Datos..... Ya tengo la lista de mi Menu ... ahora agregare las SubOpciones y despues los eventos....!!!
y como ya dije lo prometido es deuda.. terminando todo esto preparare el Tutorial ^^ !!!!!!!
Gracias de todas formas!! si tengo otro problema  te aviso ;) !!!  :bananajump: XD


Desconectado edu_guerr

  • Sv Member
  • ***
  • Mensajes: 463
Re: Crear menu en tiempo de ejecucion...
« Respuesta #14 : enero 30, 2012, 10:37:56 am »
Hermano..... Ya soluccione mi problema .. en si no era un error solo que me falto una  sintaxis en la Capa Datos.....
El de sintaxis el que mas duro da XD