Alguien sabe como recorrer (por codigo) todos los elementos de un menu
MenuStrip: Menu, submenu, subsubmenu, .....
Gracias por vuestra ayuda
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
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