Habilitar/Deshabilitar elementos de un menu por medio de una BD

13/06/2005 - 16:59 por Omar Flores | Informe spam
Hola a todos, tengo hecho un sistema al cual le quiero implementar algo de
seguridad, es decir habilitar/deshabilitar las opciones del menu a las
cuales puede tener acceso determinado usuario, ya tengo hecho el esquema de
seguridad pero el problema que tengo es el siguiente:

Por ejemplo, para habilitar una opción de un menu es
Me.nombre_elemento_del_menu.Enabled=True

y lo que yo hago es leer de una Tabla el "nombre_elemento_del_menu" pero al
momento de implantarlo no se como concatenar eso con el ".Enabled" para
asignarlo al True ya que cuando hago esto me lo toma como un string.

"nombre_elemento_del_menu".Enabled=True

Traté de convertir el nombre a objeto y sigue igual no se puede hacer esto,
espero y alguien me pueda ayudar a solucionar este detalle.

Preguntas similare

Leer las respuestas

#6 Tristan
14/06/2005 - 21:26 | Informe spam
Para leer todos los elementos de tu menú, tenga los niveles que tenga,
utiliza recursividad:

MuestraOpciones(Me.MainMenu1)

Sub MuestraOpciones(ByVal menu As Menu)
For Each item As MenuItem In menu.MenuItems
MsgBox(item.Text)
If item.MenuItems.Count > 0 Then
MuestraOpciones(item)
End If
Next
End Sub

En cuanto a la segunda pregunta. Tienes varias formas de hacerlo.

Una forma sería crear un diccionario (hashtable), formado por el par (Texto
opción - MenuItem). De esta forma una vez creado, podrás acceder en el resto
de tu aplicación, a las opciones de menú utilizando como clave el texto:

Por ejemplo:

Sub GetClavesMenu(ByVal menu As Menu, ByVal hash As Hashtable)
For Each item As MenuItem In menu.MenuItems
hash.Add(item.Text, item)
If item.MenuItems.Count > 0 Then
GetClavesMenu(item, hash)
End If
Next
End Sub

Dim menu As New MainMenu
With menu.MenuItems.Add("Archivo")
.MenuItems.Add("Abrir")
.MenuItems.Add("Guardar")
End With
With menu.MenuItems.Add("Edición")
.MenuItems.Add("Cortar")
.MenuItems.Add("Copiar")
End With
Me.Menu = menu

Dim menuIndexado As New Hashtable
GetMenuIndexado(menu, menuIndexado)

menuIndexado("Cortar").Enabled = False ' Se debería usar DirectCast
menuIndexado("Guardar").Enabled = False


La próxima versión de vb.net incluirá genéricos, con lo que el DirectCast
será innecesario. No te pongo como sería con DirectCast por que seguramente
te líe en lugar de ayudarte, pero sería lo correcto.

Hasta que aparezcan los genéricos, se pueden crear diccionarios fuertemente
tipados, en lugar de usar HashTable. Tienes información en la clase
DictionaryBase.

Juan Carlos Badiola
MVP - C#
Respuesta Responder a este mensaje
#7 Ch0rY
15/06/2005 - 05:01 | Informe spam
Si ya se que me has contestado, pero a eso me refiero, o recorres
todos los controles si no sabes de que tipo es el que buscas, o recorres
todos los controles del tipo que es, hasta dar con el.

Lo que queria saber es si se podia hacer como con Access
form.Controls("El_nombre_del_Control").

Solo era eso
gracias

"Tristan" wrote in
news:OOZ#:

Por supuesto que las hay. De todas formas, no lo entiendo, a ti ya te
he contestado esa pregunta :-(

Para empezar puedes poner referencias a los controles que te interesan
en un array, o cualquier otro tipo de colección. Ya te expliqué como
hacerlo en tu pregunta anterior.

Pero en concreto para los elementos de un menú, no tienes que crear
ninguna colección.

For Each item As MenuItem In MainMenu1.MenuItems
For Each subItem As MenuItem In item.MenuItems
MsgBox(item.Text & "-" & subItem.Text)
Next
Next

Obviamente, lo más flexible es utilizar recursividad, puesto que un
menú no tiene por que tener solo dos niveles.

La solución de recorrer todos los controles, es lo última que yo
emplearía. No tiene demasiado sentido.

Respuesta Responder a este mensaje
#8 Tristan
15/06/2005 - 16:04 | Informe spam
pero a eso me refiero, o recorres
todos los controles si no sabes de que tipo es el que buscas, o recorres
todos los controles del tipo que es, hasta dar con el.



¿Pero has visto el ejemplo que te he puesto?

Si haces eso, no tendrás que recorrer todos los controles para saber si es
el que buscas. Solo lo haces una vez para crear el diccionario, y solo
recorres las opciones del menú, no el resto de controles. Durante el resto
de ejecución de tu aplicación, accedes por clave.

Lo que queria saber es si se podia hacer como con Access
form.Controls("El_nombre_del_Control").



Si siguiendo el ejemplo que te he puesto.

Juan Carlos Badiola
MVP - C#
Respuesta Responder a este mensaje
#9 Liam
15/06/2005 - 23:14 | Informe spam
Que tal Juan Carlos, vas a decir que soy un torpe pero no me funciona. El
código que me pasaste la trato de aplicar a mi sistema y me marca el
siguiente error:

"Additional information: Object variable or With block variable not set"

Y el código que utilizo es el siguiente:

Dim menuIndexado As New Hashtable
GetMenuIndexado(mnuPrincipal, menuIndexado)
menuIndexado("Consultas").Enabled = False

NOTA: Ya tengo mi menu con mis elementos creados en modo de diseño, mi menu
se llama mnuPrincial
Algunos de las elemntos son Almacen (itmAlmacen), Catalogos(itmCatalogos),
Consultas itmConsultas)

Sub GetMenuIndexado(ByVal menu As Menu, ByVal hash As Hashtable)
For Each item As MenuItem In menu.MenuItems
hash.Add(item.Text, item)
If item.MenuItems.Count > 0 Then
GetMenuIndexado(item, hash)
End If
Next
End Sub

Al parecer en el hashtable si se guardan correctamente los nombres, el error
me lo marca al accesar a la linea: menuIndexado("Consultas").Enabled =
False, es aquí donde me marca el error antes mencionado. Espero y me puedas
ayudar, la verdad estoy muy novato en esto, es por eso que pido ayuda, y la
verdad me es muy importante establecer esto en mi sistema.


"Tristan" escribió en el mensaje
news:
Para leer todos los elementos de tu menú, tenga los niveles que tenga,
utiliza recursividad:

MuestraOpciones(Me.MainMenu1)

Sub MuestraOpciones(ByVal menu As Menu)
For Each item As MenuItem In menu.MenuItems
MsgBox(item.Text)
If item.MenuItems.Count > 0 Then
MuestraOpciones(item)
End If
Next
End Sub

En cuanto a la segunda pregunta. Tienes varias formas de hacerlo.

Una forma sería crear un diccionario (hashtable), formado por el par
(Texto opción - MenuItem). De esta forma una vez creado, podrás acceder en
el resto de tu aplicación, a las opciones de menú utilizando como clave el
texto:

Por ejemplo:

Sub GetClavesMenu(ByVal menu As Menu, ByVal hash As Hashtable)
For Each item As MenuItem In menu.MenuItems
hash.Add(item.Text, item)
If item.MenuItems.Count > 0 Then
GetClavesMenu(item, hash)
End If
Next
End Sub

Dim menu As New MainMenu
With menu.MenuItems.Add("Archivo")
.MenuItems.Add("Abrir")
.MenuItems.Add("Guardar")
End With
With menu.MenuItems.Add("Edición")
.MenuItems.Add("Cortar")
.MenuItems.Add("Copiar")
End With
Me.Menu = menu

Dim menuIndexado As New Hashtable
GetMenuIndexado(menu, menuIndexado)

menuIndexado("Cortar").Enabled = False ' Se debería usar
DirectCast
menuIndexado("Guardar").Enabled = False


La próxima versión de vb.net incluirá genéricos, con lo que el DirectCast
será innecesario. No te pongo como sería con DirectCast por que
seguramente te líe en lugar de ayudarte, pero sería lo correcto.

Hasta que aparezcan los genéricos, se pueden crear diccionarios
fuertemente tipados, en lugar de usar HashTable. Tienes información en la
clase DictionaryBase.

Juan Carlos Badiola
MVP - C#

Respuesta Responder a este mensaje
#10 Omar Flores
15/06/2005 - 23:35 | Informe spam
Una disculpa, ya encontre el error por el cual no funcionaba. Fué una
burrada mia.

Disculpen por mi torpeza y te agradezco mucho tu ayuda prestada Juan
Carlos, me fué de mucha utilidad.

Mchísimas Gracias.

Saludos.


"Liam" escribió en el mensaje
news:OUVw%
Que tal Juan Carlos, vas a decir que soy un torpe pero no me funciona. El
código que me pasaste la trato de aplicar a mi sistema y me marca el
siguiente error:

"Additional information: Object variable or With block variable not set"

Y el código que utilizo es el siguiente:

Dim menuIndexado As New Hashtable
GetMenuIndexado(mnuPrincipal, menuIndexado)
menuIndexado("Consultas").Enabled = False

NOTA: Ya tengo mi menu con mis elementos creados en modo de diseño, mi
menu se llama mnuPrincial
Algunos de las elemntos son Almacen (itmAlmacen), Catalogos(itmCatalogos),
Consultas itmConsultas)

Sub GetMenuIndexado(ByVal menu As Menu, ByVal hash As Hashtable)
For Each item As MenuItem In menu.MenuItems
hash.Add(item.Text, item)
If item.MenuItems.Count > 0 Then
GetMenuIndexado(item, hash)
End If
Next
End Sub

Al parecer en el hashtable si se guardan correctamente los nombres, el
error me lo marca al accesar a la linea: menuIndexado("Consultas").Enabled
= False, es aquí donde me marca el error antes mencionado. Espero y me
puedas ayudar, la verdad estoy muy novato en esto, es por eso que pido
ayuda, y la verdad me es muy importante establecer esto en mi sistema.


"Tristan" escribió en el mensaje
news:
Para leer todos los elementos de tu menú, tenga los niveles que tenga,
utiliza recursividad:

MuestraOpciones(Me.MainMenu1)

Sub MuestraOpciones(ByVal menu As Menu)
For Each item As MenuItem In menu.MenuItems
MsgBox(item.Text)
If item.MenuItems.Count > 0 Then
MuestraOpciones(item)
End If
Next
End Sub

En cuanto a la segunda pregunta. Tienes varias formas de hacerlo.

Una forma sería crear un diccionario (hashtable), formado por el par
(Texto opción - MenuItem). De esta forma una vez creado, podrás acceder
en el resto de tu aplicación, a las opciones de menú utilizando como
clave el texto:

Por ejemplo:

Sub GetClavesMenu(ByVal menu As Menu, ByVal hash As Hashtable)
For Each item As MenuItem In menu.MenuItems
hash.Add(item.Text, item)
If item.MenuItems.Count > 0 Then
GetClavesMenu(item, hash)
End If
Next
End Sub

Dim menu As New MainMenu
With menu.MenuItems.Add("Archivo")
.MenuItems.Add("Abrir")
.MenuItems.Add("Guardar")
End With
With menu.MenuItems.Add("Edición")
.MenuItems.Add("Cortar")
.MenuItems.Add("Copiar")
End With
Me.Menu = menu

Dim menuIndexado As New Hashtable
GetMenuIndexado(menu, menuIndexado)

menuIndexado("Cortar").Enabled = False ' Se debería usar
DirectCast
menuIndexado("Guardar").Enabled = False


La próxima versión de vb.net incluirá genéricos, con lo que el DirectCast
será innecesario. No te pongo como sería con DirectCast por que
seguramente te líe en lugar de ayudarte, pero sería lo correcto.

Hasta que aparezcan los genéricos, se pueden crear diccionarios
fuertemente tipados, en lugar de usar HashTable. Tienes información en la
clase DictionaryBase.

Juan Carlos Badiola
MVP - C#





email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida