MenuItem

18/10/2006 - 16:56 por Juan Suarez | Informe spam
Hola que tal?

En una aplicacion Windows tengo un formulario con un menu, a traves de una
clase quiero acceder a la coleccion de menues, Lo estoy haciendo de la
siguiente manera:

public static void HabilitarMenu(Form frmFormulario, String strMenu)
{
foreach(Control ctrlControl in frmFormulario.Controls)
{
if (ctrlControl is MenuItem)
}

En el if, quiero mo me reconoce los elementos del menu como pertencientes a
Controls.

Alguien sabe como controlar esto?

Hasta pronto y muchas gracias.

P/D: Trabajo con VS2003 y Framework 1.1.
Juan Suarez

Preguntas similare

Leer las respuestas

#6 Roberto M. Oliva
19/10/2006 - 11:18 | Informe spam
Hola!

Y ya puestos... porque no lo haces recursivamente?? El codigo va a ser
mucho mas sencillo y te va a servir para cualquier nivel:

public static void HabilitarMenu(Form frmFormulario, string
strMenu, bool habilitar)
{
foreach (MenuItem menu in frmFormulario.Menu.MenuItems)
if(menu.Text.ToUpper() == strMenu.ToUpper())
foreach (MenuItem submenu in menu.MenuItems)
HabilitarSubMenu(submenu, habilitar);
}

public static void HabilitarSubMenu(MenuItem item, bool
habilitar)
{
item.Enabled = habilitar;
foreach (MenuItem subMenu in item.MenuItems)
HabilitarSubMenu(subMenu, habilitar);
}

Ademas, le pasas un flag para habilitarlo o deshabilitarlo.
Lo puedes llamar de igual manera, con el flag de habilitar/dehabilitar:

Class1.HabilitarMenu(this,"Prueba 2", true);

Y lo del acceso al Menu, no sabia que habia un accesor ya hecho por el
propio .NET Framework... no me acordaba :(

Espero que te ayude
Un saludo
Roberto



Juan Suarez ha escrito:

Hola que tal?

Antes que nada quiero agradecerles por sus respuestas.
He solucionado el problema de la siguiente manera:
En una clase tengo el sigueinte codigo:

public static void HabilitarMenu(Form frmFormulario, String strMenu)
{
//Empiezo con el nivel Cero del MenuItem
for (int intNivel0 =0; intNivel0 < frmFormulario.Menu.MenuItems.Count ;
intNivel0++)
{
if (frmFormulario.Menu.MenuItems[intNivel0].Text == strMenu)
frmFormulario.Menu.MenuItems[intNivel0].Enabled = true;
//Continuo con el nivel 1 del MenuItem
for (int intNivel1 = 0; intNivel1 <
frmFormulario.Menu.MenuItems[intNivel0].MenuItems.Count ; intNivel1++)
{
if (frmFormulario.Menu.MenuItems[intNivel0].MenuItems[intNivel1].Text
== strMenu)
frmFormulario.Menu.MenuItems[intNivel0].MenuItems[intNivel1].Enabled
= true;
//Sigo con el Nivel 2 del MenuItem
for (int intNivel2 = 0; intNivel2 <
frmFormulario.Menu.MenuItems[intNivel0].MenuItems[intNivel1].MenuItems.Count
; intNivel2++)
{
if
(frmFormulario.Menu.MenuItems[intNivel0].MenuItems[intNivel1].MenuItems[intNivel2].Text
== strMenu)
frmFormulario.Menu.MenuItems[intNivel0].MenuItems[intNivel1].MenuItems[intNivel2].Enabled=true;
//Vamos aqui con el nivel 3
for (int intNivel3 = 0; intNivel3 <
frmFormulario.Menu.MenuItems[intNivel0].MenuItems[intNivel1].MenuItems[intNivel2].MenuItems.Count;
intNivel3++)
if
(frmFormulario.Menu.MenuItems[intNivel0].MenuItems[intNivel1].MenuItems[intNivel2].MenuItems[intNivel3].Text
== strMenu)
frmFormulario.Menu.MenuItems[intNivel0].MenuItems[intNivel1].MenuItems[intNivel2].MenuItems[intNivel3].Enabled=true;
}
}
}
}

Es capaz de ir habilitando hasta el nivel tres, empezando desde el Nivel 0,
no es necesario que el Modifier del Menu sea public.

Luego desde el formulario en el cual lo necesito, lo llamo de la siguiente
manera.

Class1.HabilitarMenu(this,"Prueba 2");

Formulario y nombre del Menu, respectivamente.

Suerte y muchas gracias.
Juan Suarez
"Bela Istok" escribió en el mensaje
news:
> Hola, es mas sencillo de lo que parece, en realidad los menus no son
> controles de la formas son hijos de el menu principal, deberias poder
> accederlos a traves de Forma.Menu.MenuItems (ya que aqui es donde se
> almacenan), y cada MenuItem a su ves puede contener sub-menues así que
> esto debes tenerlo en cuenta tambien.
>
> Saludos,
>
> Bela Istok
>
> "Juan Suarez" wrote in message
> news:
>> Hola que tal?
>>
>> En una aplicacion Windows tengo un formulario con un menu, a traves de
>> una clase quiero acceder a la coleccion de menues, Lo estoy haciendo de
>> la siguiente manera:
>>
>> public static void HabilitarMenu(Form frmFormulario, String strMenu)
>> {
>> foreach(Control ctrlControl in frmFormulario.Controls)
>> {
>> if (ctrlControl is MenuItem)
>> }
>>
>> En el if, quiero mo me reconoce los elementos del menu como pertencientes
>> a Controls.
>>
>> Alguien sabe como controlar esto?
>>
>> Hasta pronto y muchas gracias.
>>
>> P/D: Trabajo con VS2003 y Framework 1.1.
>> Juan Suarez
>>
>
Respuesta Responder a este mensaje
#7 Juan Suarez
19/10/2006 - 17:39 | Informe spam
Hola Roberto,

Copiando y pegando el codigo en mi clase no me funciona, hice algunas
modificaciones y trabaja bien, pero solo hasta el primer nivel, cuando llega
al segundo se funde, mira el codigo con las modificaciones aqui:

public static void HabilitarMenu2(Form frmFormulario, String strMenu, bool
habilitar)
{
foreach (MenuItem menu in frmFormulario.Menu.MenuItems)
{
//MessageBox.Show(menu.Text.ToString());
if (menu.Text.ToUpper() == strMenu.ToUpper())
menu.Enabled=habilitar;
foreach (MenuItem SubMenu in menu.MenuItems)
{
//MessageBox.Show(SubMenu.Text.ToString());
if(SubMenu.Text.ToUpper() == strMenu.ToUpper())
HabilitarSubMenu(SubMenu,habilitar);
}
}
}
public static void HabilitarSubMenu(MenuItem item, bool habilitar)
{

item.Enabled=habilitar;
foreach (MenuItem subMenu in item.MenuItems)
{
MessageBox.Show(subMenu.Text.ToString() + " " + item.Text.ToString());
//if (subMenu.Text.ToUpper() == item.Text.ToUpper())
HabilitarSubMenu(subMenu,habilitar);
}
}

Pruebalo sin el llamado a la clase HabilitarSubMenu que se encuentra dentro
del foreach de la misma clase.

Suerte y Gracias.

Juan Suarez
"Roberto M. Oliva" escribió en el mensaje
news:

Hola!

Y ya puestos... porque no lo haces recursivamente?? El codigo va a ser
mucho mas sencillo y te va a servir para cualquier nivel:

public static void HabilitarMenu(Form frmFormulario, string
strMenu, bool habilitar)
{
foreach (MenuItem menu in frmFormulario.Menu.MenuItems)
if(menu.Text.ToUpper() == strMenu.ToUpper())
foreach (MenuItem submenu in menu.MenuItems)
HabilitarSubMenu(submenu, habilitar);
}

public static void HabilitarSubMenu(MenuItem item, bool
habilitar)
{
item.Enabled = habilitar;
foreach (MenuItem subMenu in item.MenuItems)
HabilitarSubMenu(subMenu, habilitar);
}

Ademas, le pasas un flag para habilitarlo o deshabilitarlo.
Lo puedes llamar de igual manera, con el flag de habilitar/dehabilitar:

Class1.HabilitarMenu(this,"Prueba 2", true);

Y lo del acceso al Menu, no sabia que habia un accesor ya hecho por el
propio .NET Framework... no me acordaba :(

Espero que te ayude
Un saludo
Roberto



Juan Suarez ha escrito:

Hola que tal?

Antes que nada quiero agradecerles por sus respuestas.
He solucionado el problema de la siguiente manera:
En una clase tengo el sigueinte codigo:

public static void HabilitarMenu(Form frmFormulario, String strMenu)
{
//Empiezo con el nivel Cero del MenuItem
for (int intNivel0 =0; intNivel0 < frmFormulario.Menu.MenuItems.Count ;
intNivel0++)
{
if (frmFormulario.Menu.MenuItems[intNivel0].Text == strMenu)
frmFormulario.Menu.MenuItems[intNivel0].Enabled = true;
//Continuo con el nivel 1 del MenuItem
for (int intNivel1 = 0; intNivel1 <
frmFormulario.Menu.MenuItems[intNivel0].MenuItems.Count ; intNivel1++)
{
if
(frmFormulario.Menu.MenuItems[intNivel0].MenuItems[intNivel1].Text
== strMenu)

frmFormulario.Menu.MenuItems[intNivel0].MenuItems[intNivel1].Enabled
= true;
//Sigo con el Nivel 2 del MenuItem
for (int intNivel2 = 0; intNivel2 <
frmFormulario.Menu.MenuItems[intNivel0].MenuItems[intNivel1].MenuItems.Count
; intNivel2++)
{
if
(frmFormulario.Menu.MenuItems[intNivel0].MenuItems[intNivel1].MenuItems[intNivel2].Text
== strMenu)

frmFormulario.Menu.MenuItems[intNivel0].MenuItems[intNivel1].MenuItems[intNivel2].Enabled=true;
//Vamos aqui con el nivel 3
for (int intNivel3 = 0; intNivel3 <
frmFormulario.Menu.MenuItems[intNivel0].MenuItems[intNivel1].MenuItems[intNivel2].MenuItems.Count;
intNivel3++)
if
(frmFormulario.Menu.MenuItems[intNivel0].MenuItems[intNivel1].MenuItems[intNivel2].MenuItems[intNivel3].Text
== strMenu)

frmFormulario.Menu.MenuItems[intNivel0].MenuItems[intNivel1].MenuItems[intNivel2].MenuItems[intNivel3].Enabled=true;
}
}
}
}

Es capaz de ir habilitando hasta el nivel tres, empezando desde el Nivel
0,
no es necesario que el Modifier del Menu sea public.

Luego desde el formulario en el cual lo necesito, lo llamo de la siguiente
manera.

Class1.HabilitarMenu(this,"Prueba 2");

Formulario y nombre del Menu, respectivamente.

Suerte y muchas gracias.
Juan Suarez
"Bela Istok" escribió en el mensaje
news:
> Hola, es mas sencillo de lo que parece, en realidad los menus no son
> controles de la formas son hijos de el menu principal, deberias poder
> accederlos a traves de Forma.Menu.MenuItems (ya que aqui es donde se
> almacenan), y cada MenuItem a su ves puede contener sub-menues así que
> esto debes tenerlo en cuenta tambien.
>
> Saludos,
>
> Bela Istok
>
> "Juan Suarez" wrote in message
> news:
>> Hola que tal?
>>
>> En una aplicacion Windows tengo un formulario con un menu, a traves de
>> una clase quiero acceder a la coleccion de menues, Lo estoy haciendo de
>> la siguiente manera:
>>
>> public static void HabilitarMenu(Form frmFormulario, String strMenu)
>> {
>> foreach(Control ctrlControl in frmFormulario.Controls)
>> {
>> if (ctrlControl is MenuItem)
>> }
>>
>> En el if, quiero mo me reconoce los elementos del menu como
>> pertencientes
>> a Controls.
>>
>> Alguien sabe como controlar esto?
>>
>> Hasta pronto y muchas gracias.
>>
>> P/D: Trabajo con VS2003 y Framework 1.1.
>> Juan Suarez
>>
>
Respuesta Responder a este mensaje
#8 Roberto M. Oliva
20/10/2006 - 11:57 | Informe spam
Hola Juan!

Perdona por el restraso en contestarte, me he dado cuenta de que el
funcionamiento de los menus en VS 2003 es diferente del VS 2005 y he
estado buscando un entorno con VS 2003 para reproducir tu problema.
Ademas tengo un pequeño inconveniente y es que el VS 2003 que he
encontrado solo tiene Visual Basic y no C#... bueno intentare
traducirlo

Vamos a ver no se cual es el problema, ya que a mi me ha funcionado a
la perfeccion el siguiente codigo:

Public Sub HabilitarMenu(ByVal frm As Form, ByVal strMenu As
String, ByVal habilitar As Boolean)
Dim objMenu As System.Windows.Forms.MenuItem

For Each objMenu In frm.Menu.MenuItems
If objMenu.Text.ToUpper = strMenu.ToUpper Then
HabilitarSubMenu(objMenu, habilitar)

End If
Next
End Sub

Public Sub HabilitarSubMenu(ByVal objMenu As
System.Windows.Forms.MenuItem, ByVal habilitar As Boolean)
Dim objSubMenu As System.Windows.Forms.MenuItem

objMenu.Enabled = habilitar

For Each objSubMenu In objMenu.MenuItems
HabilitarSubMenu(objSubMenu, habilitar)
Next
End Sub

En C# sera algo asi:

public void HabilitarMenu(Form frm, String strMenu, bool habilitar)
{
System.Windows.Forms.MenuItem objMenu;

foreach objMenu in frm.Menu.MenuItems
{
if (objMenu.Text.ToUpper == strMenu.ToUpper)
HabilitarSubMenu(objMenu, habilitar);
}
}
public void HabilitarSubMenu(System.Windows.Forms.MenuItem objMenu ,
bool habilitar)
System.Windows.Forms.MenuItem objSubMenu;
{
objMenu.Enabled = habilitar;

foreach objSubMenu In objMenu.MenuItems
HabilitarSubMenu(objSubMenu, habilitar);
}

Tienes que tener en cuenta una cosa y es que deshabilitando un menu,
deshabilitas automaticamente todos los menus que hay debajo. Por lo que
a lo mejor es mas efectivo, con una funcion recursiva, buscar el menu
padre que quieras desactivar y cambiar solo este y no los que cuelgan
de el.

Bueno, un saludo
Roberto M. Oliva



Juan Suarez ha escrito:

Hola Roberto,

Copiando y pegando el codigo en mi clase no me funciona, hice algunas
modificaciones y trabaja bien, pero solo hasta el primer nivel, cuando llega
al segundo se funde, mira el codigo con las modificaciones aqui:

public static void HabilitarMenu2(Form frmFormulario, String strMenu, bool
habilitar)
{
foreach (MenuItem menu in frmFormulario.Menu.MenuItems)
{
//MessageBox.Show(menu.Text.ToString());
if (menu.Text.ToUpper() == strMenu.ToUpper())
menu.Enabled=habilitar;
foreach (MenuItem SubMenu in menu.MenuItems)
{
//MessageBox.Show(SubMenu.Text.ToString());
if(SubMenu.Text.ToUpper() == strMenu.ToUpper())
HabilitarSubMenu(SubMenu,habilitar);
}
}
}
public static void HabilitarSubMenu(MenuItem item, bool habilitar)
{

item.Enabled=habilitar;
foreach (MenuItem subMenu in item.MenuItems)
{
MessageBox.Show(subMenu.Text.ToString() + " " + item.Text.ToString());
//if (subMenu.Text.ToUpper() == item.Text.ToUpper())
HabilitarSubMenu(subMenu,habilitar);
}
}

Pruebalo sin el llamado a la clase HabilitarSubMenu que se encuentra dentro
del foreach de la misma clase.

Suerte y Gracias.

Juan Suarez
"Roberto M. Oliva" escribió en el mensaje
news:

Hola!

Y ya puestos... porque no lo haces recursivamente?? El codigo va a ser
mucho mas sencillo y te va a servir para cualquier nivel:

public static void HabilitarMenu(Form frmFormulario, string
strMenu, bool habilitar)
{
foreach (MenuItem menu in frmFormulario.Menu.MenuItems)
if(menu.Text.ToUpper() == strMenu.ToUpper())
foreach (MenuItem submenu in menu.MenuItems)
HabilitarSubMenu(submenu, habilitar);
}

public static void HabilitarSubMenu(MenuItem item, bool
habilitar)
{
item.Enabled = habilitar;
foreach (MenuItem subMenu in item.MenuItems)
HabilitarSubMenu(subMenu, habilitar);
}

Ademas, le pasas un flag para habilitarlo o deshabilitarlo.
Lo puedes llamar de igual manera, con el flag de habilitar/dehabilitar:

Class1.HabilitarMenu(this,"Prueba 2", true);

Y lo del acceso al Menu, no sabia que habia un accesor ya hecho por el
propio .NET Framework... no me acordaba :(

Espero que te ayude
Un saludo
Roberto



Juan Suarez ha escrito:

> Hola que tal?
>
> Antes que nada quiero agradecerles por sus respuestas.
> He solucionado el problema de la siguiente manera:
> En una clase tengo el sigueinte codigo:
>
> public static void HabilitarMenu(Form frmFormulario, String strMenu)
> {
> //Empiezo con el nivel Cero del MenuItem
> for (int intNivel0 =0; intNivel0 < frmFormulario.Menu.MenuItems.Count ;
> intNivel0++)
> {
> if (frmFormulario.Menu.MenuItems[intNivel0].Text == strMenu)
> frmFormulario.Menu.MenuItems[intNivel0].Enabled = true;
> //Continuo con el nivel 1 del MenuItem
> for (int intNivel1 = 0; intNivel1 <
> frmFormulario.Menu.MenuItems[intNivel0].MenuItems.Count ; intNivel1++)
> {
> if
> (frmFormulario.Menu.MenuItems[intNivel0].MenuItems[intNivel1].Text
> == strMenu)
>
> frmFormulario.Menu.MenuItems[intNivel0].MenuItems[intNivel1].Enabled
> = true;
> //Sigo con el Nivel 2 del MenuItem
> for (int intNivel2 = 0; intNivel2 <
> frmFormulario.Menu.MenuItems[intNivel0].MenuItems[intNivel1].MenuItems.Count
> ; intNivel2++)
> {
> if
> (frmFormulario.Menu.MenuItems[intNivel0].MenuItems[intNivel1].MenuItems[intNivel2].Text
> == strMenu)
>
> frmFormulario.Menu.MenuItems[intNivel0].MenuItems[intNivel1].MenuItems[intNivel2].Enabled=true;
> //Vamos aqui con el nivel 3
> for (int intNivel3 = 0; intNivel3 <
> frmFormulario.Menu.MenuItems[intNivel0].MenuItems[intNivel1].MenuItems[intNivel2].MenuItems.Count;
> intNivel3++)
> if
> (frmFormulario.Menu.MenuItems[intNivel0].MenuItems[intNivel1].MenuItems[intNivel2].MenuItems[intNivel3].Text
> == strMenu)
>
> frmFormulario.Menu.MenuItems[intNivel0].MenuItems[intNivel1].MenuItems[intNivel2].MenuItems[intNivel3].Enabled=true;
> }
> }
> }
> }
>
> Es capaz de ir habilitando hasta el nivel tres, empezando desde el Nivel
> 0,
> no es necesario que el Modifier del Menu sea public.
>
> Luego desde el formulario en el cual lo necesito, lo llamo de la siguiente
> manera.
>
> Class1.HabilitarMenu(this,"Prueba 2");
>
> Formulario y nombre del Menu, respectivamente.
>
> Suerte y muchas gracias.
> Juan Suarez
> "Bela Istok" escribió en el mensaje
> news:
> > Hola, es mas sencillo de lo que parece, en realidad los menus no son
> > controles de la formas son hijos de el menu principal, deberias poder
> > accederlos a traves de Forma.Menu.MenuItems (ya que aqui es donde se
> > almacenan), y cada MenuItem a su ves puede contener sub-menues así que
> > esto debes tenerlo en cuenta tambien.
> >
> > Saludos,
> >
> > Bela Istok
> >
> > "Juan Suarez" wrote in message
> > news:
> >> Hola que tal?
> >>
> >> En una aplicacion Windows tengo un formulario con un menu, a traves de
> >> una clase quiero acceder a la coleccion de menues, Lo estoy haciendo de
> >> la siguiente manera:
> >>
> >> public static void HabilitarMenu(Form frmFormulario, String strMenu)
> >> {
> >> foreach(Control ctrlControl in frmFormulario.Controls)
> >> {
> >> if (ctrlControl is MenuItem)
> >> }
> >>
> >> En el if, quiero mo me reconoce los elementos del menu como
> >> pertencientes
> >> a Controls.
> >>
> >> Alguien sabe como controlar esto?
> >>
> >> Hasta pronto y muchas gracias.
> >>
> >> P/D: Trabajo con VS2003 y Framework 1.1.
> >> Juan Suarez
> >>
> >
Respuesta Responder a este mensaje
#9 Juan Suarez
20/10/2006 - 15:15 | Informe spam
Hola Roberto,

Muchas gracias por tus respuestas.

Voy a probar el codigo en un 2005.

Mucha Suerte y nuevamente muchas gracias.

Juan Suarez
"Roberto M. Oliva" escribió en el mensaje
news:

Hola Juan!

Perdona por el restraso en contestarte, me he dado cuenta de que el
funcionamiento de los menus en VS 2003 es diferente del VS 2005 y he
estado buscando un entorno con VS 2003 para reproducir tu problema.
Ademas tengo un pequeño inconveniente y es que el VS 2003 que he
encontrado solo tiene Visual Basic y no C#... bueno intentare
traducirlo

Vamos a ver no se cual es el problema, ya que a mi me ha funcionado a
la perfeccion el siguiente codigo:

Public Sub HabilitarMenu(ByVal frm As Form, ByVal strMenu As
String, ByVal habilitar As Boolean)
Dim objMenu As System.Windows.Forms.MenuItem

For Each objMenu In frm.Menu.MenuItems
If objMenu.Text.ToUpper = strMenu.ToUpper Then
HabilitarSubMenu(objMenu, habilitar)

End If
Next
End Sub

Public Sub HabilitarSubMenu(ByVal objMenu As
System.Windows.Forms.MenuItem, ByVal habilitar As Boolean)
Dim objSubMenu As System.Windows.Forms.MenuItem

objMenu.Enabled = habilitar

For Each objSubMenu In objMenu.MenuItems
HabilitarSubMenu(objSubMenu, habilitar)
Next
End Sub

En C# sera algo asi:

public void HabilitarMenu(Form frm, String strMenu, bool habilitar)
{
System.Windows.Forms.MenuItem objMenu;

foreach objMenu in frm.Menu.MenuItems
{
if (objMenu.Text.ToUpper == strMenu.ToUpper)
HabilitarSubMenu(objMenu, habilitar);
}
}
public void HabilitarSubMenu(System.Windows.Forms.MenuItem objMenu ,
bool habilitar)
System.Windows.Forms.MenuItem objSubMenu;
{
objMenu.Enabled = habilitar;

foreach objSubMenu In objMenu.MenuItems
HabilitarSubMenu(objSubMenu, habilitar);
}

Tienes que tener en cuenta una cosa y es que deshabilitando un menu,
deshabilitas automaticamente todos los menus que hay debajo. Por lo que
a lo mejor es mas efectivo, con una funcion recursiva, buscar el menu
padre que quieras desactivar y cambiar solo este y no los que cuelgan
de el.

Bueno, un saludo
Roberto M. Oliva



Juan Suarez ha escrito:

Hola Roberto,

Copiando y pegando el codigo en mi clase no me funciona, hice algunas
modificaciones y trabaja bien, pero solo hasta el primer nivel, cuando
llega
al segundo se funde, mira el codigo con las modificaciones aqui:

public static void HabilitarMenu2(Form frmFormulario, String strMenu, bool
habilitar)
{
foreach (MenuItem menu in frmFormulario.Menu.MenuItems)
{
//MessageBox.Show(menu.Text.ToString());
if (menu.Text.ToUpper() == strMenu.ToUpper())
menu.Enabled=habilitar;
foreach (MenuItem SubMenu in menu.MenuItems)
{
//MessageBox.Show(SubMenu.Text.ToString());
if(SubMenu.Text.ToUpper() == strMenu.ToUpper())
HabilitarSubMenu(SubMenu,habilitar);
}
}
}
public static void HabilitarSubMenu(MenuItem item, bool habilitar)
{

item.Enabled=habilitar;
foreach (MenuItem subMenu in item.MenuItems)
{
MessageBox.Show(subMenu.Text.ToString() + " " + item.Text.ToString());
//if (subMenu.Text.ToUpper() == item.Text.ToUpper())
HabilitarSubMenu(subMenu,habilitar);
}
}

Pruebalo sin el llamado a la clase HabilitarSubMenu que se encuentra
dentro
del foreach de la misma clase.

Suerte y Gracias.

Juan Suarez
"Roberto M. Oliva" escribió en el mensaje
news:

Hola!

Y ya puestos... porque no lo haces recursivamente?? El codigo va a ser
mucho mas sencillo y te va a servir para cualquier nivel:

public static void HabilitarMenu(Form frmFormulario, string
strMenu, bool habilitar)
{
foreach (MenuItem menu in frmFormulario.Menu.MenuItems)
if(menu.Text.ToUpper() == strMenu.ToUpper())
foreach (MenuItem submenu in menu.MenuItems)
HabilitarSubMenu(submenu, habilitar);
}

public static void HabilitarSubMenu(MenuItem item, bool
habilitar)
{
item.Enabled = habilitar;
foreach (MenuItem subMenu in item.MenuItems)
HabilitarSubMenu(subMenu, habilitar);
}

Ademas, le pasas un flag para habilitarlo o deshabilitarlo.
Lo puedes llamar de igual manera, con el flag de habilitar/dehabilitar:

Class1.HabilitarMenu(this,"Prueba 2", true);

Y lo del acceso al Menu, no sabia que habia un accesor ya hecho por el
propio .NET Framework... no me acordaba :(

Espero que te ayude
Un saludo
Roberto



Juan Suarez ha escrito:

> Hola que tal?
>
> Antes que nada quiero agradecerles por sus respuestas.
> He solucionado el problema de la siguiente manera:
> En una clase tengo el sigueinte codigo:
>
> public static void HabilitarMenu(Form frmFormulario, String strMenu)
> {
> //Empiezo con el nivel Cero del MenuItem
> for (int intNivel0 =0; intNivel0 < frmFormulario.Menu.MenuItems.Count
> ;
> intNivel0++)
> {
> if (frmFormulario.Menu.MenuItems[intNivel0].Text == strMenu)
> frmFormulario.Menu.MenuItems[intNivel0].Enabled = true;
> //Continuo con el nivel 1 del MenuItem
> for (int intNivel1 = 0; intNivel1 <
> frmFormulario.Menu.MenuItems[intNivel0].MenuItems.Count ; intNivel1++)
> {
> if
> (frmFormulario.Menu.MenuItems[intNivel0].MenuItems[intNivel1].Text
> == strMenu)
>
> frmFormulario.Menu.MenuItems[intNivel0].MenuItems[intNivel1].Enabled
> = true;
> //Sigo con el Nivel 2 del MenuItem
> for (int intNivel2 = 0; intNivel2 <
> frmFormulario.Menu.MenuItems[intNivel0].MenuItems[intNivel1].MenuItems.Count
> ; intNivel2++)
> {
> if
> (frmFormulario.Menu.MenuItems[intNivel0].MenuItems[intNivel1].MenuItems[intNivel2].Text
> == strMenu)
>
> frmFormulario.Menu.MenuItems[intNivel0].MenuItems[intNivel1].MenuItems[intNivel2].Enabled=true;
> //Vamos aqui con el nivel 3
> for (int intNivel3 = 0; intNivel3 <
> frmFormulario.Menu.MenuItems[intNivel0].MenuItems[intNivel1].MenuItems[intNivel2].MenuItems.Count;
> intNivel3++)
> if
> (frmFormulario.Menu.MenuItems[intNivel0].MenuItems[intNivel1].MenuItems[intNivel2].MenuItems[intNivel3].Text
> == strMenu)
>
> frmFormulario.Menu.MenuItems[intNivel0].MenuItems[intNivel1].MenuItems[intNivel2].MenuItems[intNivel3].Enabled=true;
> }
> }
> }
> }
>
> Es capaz de ir habilitando hasta el nivel tres, empezando desde el Nivel
> 0,
> no es necesario que el Modifier del Menu sea public.
>
> Luego desde el formulario en el cual lo necesito, lo llamo de la
> siguiente
> manera.
>
> Class1.HabilitarMenu(this,"Prueba 2");
>
> Formulario y nombre del Menu, respectivamente.
>
> Suerte y muchas gracias.
> Juan Suarez
> "Bela Istok" escribió en el mensaje
> news:
> > Hola, es mas sencillo de lo que parece, en realidad los menus no son
> > controles de la formas son hijos de el menu principal, deberias poder
> > accederlos a traves de Forma.Menu.MenuItems (ya que aqui es donde se
> > almacenan), y cada MenuItem a su ves puede contener sub-menues así que
> > esto debes tenerlo en cuenta tambien.
> >
> > Saludos,
> >
> > Bela Istok
> >
> > "Juan Suarez" wrote in message
> > news:
> >> Hola que tal?
> >>
> >> En una aplicacion Windows tengo un formulario con un menu, a traves
> >> de
> >> una clase quiero acceder a la coleccion de menues, Lo estoy haciendo
> >> de
> >> la siguiente manera:
> >>
> >> public static void HabilitarMenu(Form frmFormulario, String strMenu)
> >> {
> >> foreach(Control ctrlControl in frmFormulario.Controls)
> >> {
> >> if (ctrlControl is MenuItem)
> >> }
> >>
> >> En el if, quiero mo me reconoce los elementos del menu como
> >> pertencientes
> >> a Controls.
> >>
> >> Alguien sabe como controlar esto?
> >>
> >> Hasta pronto y muchas gracias.
> >>
> >> P/D: Trabajo con VS2003 y Framework 1.1.
> >> Juan Suarez
> >>
> >
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida