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:
Mostrar la cita
¿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.
#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:#
Mostrar la cita
#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:
Mostrar la cita
#4 Alberto Poblacion
21/10/2009 - 08:56 | Informe spam
"Edilberto Arteaga" wrote in message
news:
Mostrar la cita
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.
#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:
Mostrar la cita
Ads by Google
Search Busqueda sugerida