Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Recorrer todos los elementos de un menu

875 views
Skip to first unread message

CC

unread,
Mar 24, 2006, 6:08:35 AM3/24/06
to
Hola a todos:

Alguien sabe como recorrer (por codigo) todos los elementos de un menu
MenuStrip: Menu, submenu, subsubmenu, .....

Gracias por vuestra ayuda

Natalia


Luis Miguel Blanco

unread,
Mar 24, 2006, 3:10:02 PM3/24/06
to
Hola Natalia

Para conseguir esta funcionalidad que mencionas, es necesario implementar un
algoritmo recursivo, ya que debemos tener en cuenta que un objeto MenuStrip
contiene los elementos u opciones de la barra principal en la propiedad
Items, que no es otra cosa que una colección ToolStripItemCollection.

Cada uno de los elementos de esa colección, es también una opción de menú,
que a su vez puede tener opciones dependientes a las que accedemos a través
de la propiedad DropDownItems, y así sucesivamente para cada opción que tenga
subopciones.

Supongamos un formulario con una estructura de menú como la siguiente:

Archivo
----Abrir
----Cerrar
Editar
----Copiar
----Pegar
--------Normal
--------Especial

Ahora añadimos un botón al formulario, y un listbox. Al pulsar el botón
vamos a ejecutar el código que te muestro a continuación, que se encargará de
recorrer la estructura de opciones del menú, e ir plasmándola en el listbox.
Observa que en uno de los métodos utilizamos recursividad, para recorrer los
submenús de las opciones que lo tengan.

'//////////////////////////////////////////////
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
Me.RecorrerEstructuraMenu(Me.mnuMenu)
End Sub

Private Sub RecorrerEstructuraMenu(ByVal oMenu As MenuStrip)
' en este método recorremos las opciones de la barra
' principal (el primer nivel) de la colección de elementos
' del menú del formulario
For Each oOpcionMenu As ToolStripMenuItem In oMenu.Items
Me.lstListaMenu.Items.Add(oOpcionMenu.Text)

' si una opción de menú de la barra de primer nivel
' tiene a su vez opciones, llamar a otro método que
' será el que recorra estas subopciones
If oOpcionMenu.DropDownItems.Count > 0 Then
Me.RecorrerSubmenu(oOpcionMenu.DropDownItems, "----")
End If
Next
End Sub

Private Sub RecorrerSubmenu(ByVal oSubmenuItems As
ToolStripItemCollection, ByVal sGuiones As String)
' en este método recorremos las opciones de nivel inferior
' de una opción de menú principal, y si alguna de estas opciones
' tiene a su vez submenús, volvemos a llamar recursivamente a
' este método para ir profundizando en el siguiente nivel,
' y así sucesivamente
For Each oSubitem As ToolStripMenuItem In oSubmenuItems
Me.lstListaMenu.Items.Add(sGuiones & oSubitem.Text)

If oSubitem.DropDownItems.Count > 0 Then
Me.RecorrerSubmenu(oSubitem.DropDownItems, sGuiones & "----")
End If
Next
End Sub
End Class
'//////////////////////////////////////////////

Si estás interesada en el proyecto que contiene este ejemplo, facilítame una
dirección email y te lo envío. Puedes encontrar mi dirección email en:

http://www.dotnetmania.com/Autores/index.html

Espero que este ejemplo te sea de utilidad.

--
Un saludo
Luis Miguel Blanco
http://www.dotnetmania.com

Luis Miguel Blanco

unread,
Mar 30, 2006, 5:24:02 AM3/30/06
to
Hola de nuevo Natalia

Como me decías en un email, ciertamente, el ejemplo que te envié no
contemplaba el hecho de que en tu menú pudiera haber items separadores, cosa
que he subsanado en la siguiente versión del ejemplo ;-). En este caso, he
retocado el método RecorrerSubmenu y he subido un nivel en la jerarquía de
las clases encargadas de trabajar con los items de menú, es decir, en vez
usar ToolStripMenuItem se usa ToolStripItem, que es más genérico, y permite
comprobar si se trata de una opción de menú normal o un separador, y sólo
tener en cuenta items normales de menú, y no separadores.

'///////////////////////////////////////


Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
Me.RecorrerEstructuraMenu(Me.mnuMenu)
End Sub

Private Sub RecorrerEstructuraMenu(ByVal oMenu As MenuStrip)

For Each oOpcionMenu As ToolStripMenuItem In oMenu.Items
Me.lstListaMenu.Items.Add(oOpcionMenu.Text)

If oOpcionMenu.DropDownItems.Count > 0 Then


Me.RecorrerSubmenu(oOpcionMenu.DropDownItems, "----")
End If
Next
End Sub

Private Sub RecorrerSubmenu(ByVal oSubmenuItems As
ToolStripItemCollection, ByVal sGuiones As String)

For Each oSubitem As ToolStripItem In oSubmenuItems
If oSubitem.GetType Is GetType(ToolStripMenuItem) Then
Me.lstListaMenu.Items.Add(sGuiones & oSubitem.Text)

If CType(oSubitem, ToolStripMenuItem).DropDownItems.Count >
0 Then
Me.RecorrerSubmenu(CType(oSubitem,
ToolStripMenuItem).DropDownItems, sGuiones & "----")


End If
End If
Next
End Sub
End Class
'///////////////////////////////////////

Espero que ahora sí funcione 8-)

--
Un saludo
Luis Miguel Blanco
http://www.dotnetmania.com

0 new messages