Lista de Controles en un formulario

16/10/2009 - 19:39 por Edilberto Arteaga | Informe spam
Hola a Todos
Tengo un formulario base con una serie de controles (barras de herramientas)
del cual heredan mis demás formularios he creado un método en el que recorro
todos los objetos que estén en el formulario

protected virtual void
VerificarControles(System.Windows.Forms.Control.ControlCollection __obj__,
bool __valor__, string __str__)
{
foreach (Control __oo__ in __obj__)
{
if (__oo__.HasChildren)
VerificarControles(__oo__.Controls, __valor__, __str__);
if (__oo__.Tag != null)
if (__oo__.Tag == __str__)
__oo__.Enabled = __valor__;
}
}

pero nunca me encuentra los objetos dentro de las barras de herramientas ni
en los menus contextuales, puedo ver los grid, textbox, list etc pero no los
mencionados si ven el código por cada control que encuentro verifico si
tiene controles dentro para seguir examinándolo y así llegar al nivel mas
bajo.

Preguntas similare

Leer las respuestas

#11 Edilberto
02/11/2009 - 18:25 | Informe spam
Excelente, estoy haciendo las pruebas al respecto me va quedando de la
siguiente forma

Assembly asm = Assembly.GetEntryAssembly(); //.GetCallingAssembly();
//.GetExecutingAssembly();
Module[] mods = asm.GetModules();
foreach (Module mod in mods)
{
Type[] tipos = mod.GetTypes();
foreach (Type tipo in tipos)
{
if (tipo.IsSubclassOf(typeof(Form)))
{
if (tipo.Name == Name)
{
FieldInfo[] campos =
tipo.GetFields(BindingFlags.Public | BindingFlags.NonPublic |
BindingFlags.Instance);
foreach (FieldInfo campo in campos)
{
if (campo.Name == "components")
{
object __cmp3__;
__cmp3__ = (object)campo.GetValue(this);
ComponentCollection __aaa__ =
((Container)__cmp3__).Components;
foreach (Component __cmp13__ in __aaa__)
{
switch (__cmp13__.GetType().Name)
{
case "ContextMenuStrip":
foreach (ToolStripMenuItem
__toolstrip__ in ((System.Windows.Forms.ContextMenuStrip)__cmp13__).Items)
{
if (__toolstrip__.Tag ==
__str__)
__toolstrip__.Enabled
= __valor__;
}
break;
case "BarManager":
foreach (object __btn__ in
((DevExpress.XtraBars.BarManager)__cmp13__).Items)
{
if
(__btn__.GetType().Name == "BarButtonItem")
if
(((DevExpress.XtraBars.BarButtonItem)__btn__).Tag == __str__)
((DevExpress.XtraBars.BarButtonItem)__btn__).Enabled
= __valor__;
}
break;
}
}
}
}

}
}
}
}

Hasta el momento me va funcionando, ya que los objetos q mas problema tenia
son los Componentes los controles ya tengo la coleccion seguire probando con
todos mis formularios para ver si no tengo problemas.

Te agradesco infinitamente ya que tengo mas de una semana liado con este
problema y me has salvado de seguir con el prueba y error, gracias
nuevamente.



"Alberto Poblacion" wrote
in message news:
"Edilberto" wrote in message
news:
[...]
Assembly asm = Assembly.GetCallingAssembly(); //.GetExecutingAssembly();
Module[] mods = asm.GetModules();
foreach (Module mod in mods)
{
Type[] tipos = mod.GetTypes();
foreach (Type tipo in tipos)
{
if (tipo.IsSubclassOf(typeof(Form)))
{
if (tipo.Name == Name)
{
FieldInfo[] campos =
tipo.GetFields(BindingFlags.Public | BindingFlags.NonPublic |
BindingFlags.Instance);
foreach (FieldInfo campo in campos)
{
if
(campo.FieldType.IsSubclassOf(typeof(Control)))
{
//...
}
if
(campo.FieldType.IsSubclassOf(typeof(Component)))
{
El problema es que tengo un objeto del tipo FieldInfo y yo lo necesito
llevar a un componente con su funcionalidad como tal, por ejemplo si es
un toolstripButton convertirlo a ese tipo de objeto no solo como
FieldInfo, le he buscado por todas partees y aun no lo consigo.



El FieldInfo únicamente describe la CLASE de objeto, pero para obtener el
CONTENIDO necesitas llamar al método GetValue pasándole la instancia de la
clase que contiene ese campo. En el ejemplo anterior, estás enumerando
todos los campos de todos los formularios definidos en el ensamblado, pero
no distingues las instancias que están abiertas. Por ejemplo, de un mismo
formulario Form1 podría haber abiertas media docena de instancias en
pantalla. Cuando buscas el valor de un tolstripButton, hay que decir cuál
de esa media docena de instancias es la que contiene el control cuyo valor
buscas. Algo parecido al siguiente código:

ToolStripButton tsb = (ToolStripButton)campo.GetValue(laInstanciaDelForm);

Esto significa que el bucle que has puesto más arriba tiene que ser un
poco distinto. Cuando abras una instancia de un formulario(con
elForm.Show), es cuando puedes leer los valores de los controles que
contiene. Entonces pondrías esto:

Type tipo = elForm.GetType();

y a partir de ahi meterías el mismo código que se cita más arriba,
partiendo de la línea que dice
FieldInfo[] campos = tipo.GetFields(...)


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