Objetos en formulario WindowsForm

19/10/2009 - 23:58 por Edilberto Arteaga | Informe spam
Hola a Todos,
Como verifico si un formulario tiene determinado tipo de controles, por
decir algo verificar si tiene Menus contextuales o Grid...

Preguntas similare

Leer las respuestas

#1 Alberto Poblacion
20/10/2009 - 09:20 | Informe spam
"Edilberto Arteaga" wrote in message
news:
Hola a Todos,
Como verifico si un formulario tiene determinado tipo de controles, por
decir algo verificar si tiene Menus contextuales o Grid...



¿Desde código? Basta con que recorras recursivamente la colección
Controls de cada control, partiendo del propio formulario que a su vez es un
control. Por ejemplo, para ver si en un formulario existe algún
DataGridView:

private bool RecorrerControles(Control c)
{
if (c is DataGridView) return true;
foreach (Control c1 in c.Controls)
{
if (RecorrerControles(c1)) return true;
}
return false;
}

Llamarlo desde el propio formulario asi:

bool hayGrids = RecorrerControles(this);

Nota: Esto vale para los Controles, pero no para los Componentes (por
ejemplo, un Timer), que no forman parte de la colección Controls.
Respuesta Responder a este mensaje
#2 Edilberto Arteaga
20/10/2009 - 19:48 | Informe spam
Es que ese es el asunto los controles los puedo recorrer sin ningun
problema, pero los objetos que necesito validar si existen no estan
agregados a esa coleccion, por eso quiero verificar si el formulario X tiene
por ejemplo un Menucontextual para de ahi hacer el recorrido como
corresponde o si tiene un toolbox para recorrer sus item. lo hago asi porque
el codigo lo coloco en el formulario base del cual heredan los demas
formularios y esos controles solo existiran en los formularios heredados no
en el base.

"Alberto Poblacion"
escribió en el mensaje de noticias:#
"Edilberto Arteaga" wrote in message
news:
Hola a Todos,
Como verifico si un formulario tiene determinado tipo de controles, por
decir algo verificar si tiene Menus contextuales o Grid...



¿Desde código? Basta con que recorras recursivamente la colección
Controls de cada control, partiendo del propio formulario que a su vez es
un control. Por ejemplo, para ver si en un formulario existe algún
DataGridView:

private bool RecorrerControles(Control c)
{
if (c is DataGridView) return true;
foreach (Control c1 in c.Controls)
{
if (RecorrerControles(c1)) return true;
}
return false;
}

Llamarlo desde el propio formulario asi:

bool hayGrids = RecorrerControles(this);

Nota: Esto vale para los Controles, pero no para los Componentes (por
ejemplo, un Timer), que no forman parte de la colección Controls.

Respuesta Responder a este mensaje
#3 Edilberto Arteaga
21/10/2009 - 00:30 | Informe spam
Ya encontre algo por donde
// Recorro la lista de Componentes para verificar que estos sean validados
tambien.
foreach (Component __comp in this.components.Components)
{
if (__comp.GetType().Name == "ContextMenuStrip")
foreach (System.Windows.Forms.ToolStripMenuItem
__toolstrip__ in ((System.Windows.Forms.ContextMenuStrip)__comp).Items)
{
if (__toolstrip__.Tag == __str__)
__toolstrip__.Enabled = __valor__;
}
}
Solo lo raro es lo siguiente
al hacer debug desde el formulario hijo me dice que estan todos los
componentes incluido los bindings y los menus, pero cuando al Base le
recorro para que evalue todos los componentes solo muestra los del base, o
es que no funciona al igual que los Controles que si hago el recorrido desde
el Base aun asi me detecta los controles en el hijo

"Edilberto Arteaga" escribió en el mensaje de
noticias:
Es que ese es el asunto los controles los puedo recorrer sin ningun
problema, pero los objetos que necesito validar si existen no estan
agregados a esa coleccion, por eso quiero verificar si el formulario X
tiene por ejemplo un Menucontextual para de ahi hacer el recorrido como
corresponde o si tiene un toolbox para recorrer sus item. lo hago asi
porque el codigo lo coloco en el formulario base del cual heredan los
demas formularios y esos controles solo existiran en los formularios
heredados no en el base.

"Alberto Poblacion"
escribió en el mensaje de
noticias:#
"Edilberto Arteaga" wrote in message
news:
Hola a Todos,
Como verifico si un formulario tiene determinado tipo de controles, por
decir algo verificar si tiene Menus contextuales o Grid...



¿Desde código? Basta con que recorras recursivamente la colección
Controls de cada control, partiendo del propio formulario que a su vez es
un control. Por ejemplo, para ver si en un formulario existe algún
DataGridView:

private bool RecorrerControles(Control c)
{
if (c is DataGridView) return true;
foreach (Control c1 in c.Controls)
{
if (RecorrerControles(c1)) return true;
}
return false;
}

Llamarlo desde el propio formulario asi:

bool hayGrids = RecorrerControles(this);

Nota: Esto vale para los Controles, pero no para los Componentes (por
ejemplo, un Timer), que no forman parte de la colección Controls.

Respuesta Responder a este mensaje
#4 Alberto Poblacion
21/10/2009 - 08:56 | Informe spam
"Edilberto Arteaga" wrote in message
news:
Solo lo raro es lo siguiente
al hacer debug desde el formulario hijo me dice que estan todos los
componentes incluido los bindings y los menus, pero cuando al Base le
recorro para que evalue todos los componentes solo muestra los del base, o
es que no funciona al igual que los Controles que si hago el recorrido
desde el Base aun asi me detecta los controles en el hijo



Efectivamente, el "this.components", si lo buscas en el .designer.cs,
verás que está marcado como "private". Por lo tanto, si accedes a él desde
el formulario base, solo contiene la información de dicho formulario, ya que
no es accesible desde las clases heredadas. En cambio, el "this.Controls" es
una propiedad pública de la propia clase Form, y los hijos añaden sus
controles sobre la misma propiedad, con lo que son visibles desde la clase
madre.

Si quieres acceder al this.controls de los formularios hijos desde el
padre, puedes añadir un método virtual para que lo devuelva, y sobreescribir
el método en cada hijo.
O, si quieres hacer una "chapucilla", puedes usar Reflection para acceder
a la variable privada.
Respuesta Responder a este mensaje
#5 Edilberto Arteaga
21/10/2009 - 22:58 | Informe spam
Hice un método virtual, porque aun no he trabajado con reflexión para
hacerlo por ese método :-(

"Alberto Poblacion"
escribió en el mensaje de noticias:
"Edilberto Arteaga" wrote in message
news:
Solo lo raro es lo siguiente
al hacer debug desde el formulario hijo me dice que estan todos los
componentes incluido los bindings y los menus, pero cuando al Base le
recorro para que evalue todos los componentes solo muestra los del base,
o es que no funciona al igual que los Controles que si hago el recorrido
desde el Base aun asi me detecta los controles en el hijo



Efectivamente, el "this.components", si lo buscas en el .designer.cs,
verás que está marcado como "private". Por lo tanto, si accedes a él desde
el formulario base, solo contiene la información de dicho formulario, ya
que no es accesible desde las clases heredadas. En cambio, el
"this.Controls" es una propiedad pública de la propia clase Form, y los
hijos añaden sus controles sobre la misma propiedad, con lo que son
visibles desde la clase madre.

Si quieres acceder al this.controls de los formularios hijos desde el
padre, puedes añadir un método virtual para que lo devuelva, y
sobreescribir el método en cada hijo.
O, si quieres hacer una "chapucilla", puedes usar Reflection para
acceder a la variable privada.

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