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

#6 Edilberto Arteaga
21/10/2009 - 22:57 | Informe spam
Ummm pues no me ha quedado mas que hacer mi método virtual y en los
formularios heredados recorrer los componentes que era el punto q quería
evitar a toda costa... el tener que ir a agregar código a los formularios
heredados

"SoftJaén" escribió en el mensaje de
noticias:
"Edilberto Arteaga" escribió:

ummm creo que no me explique
En mi formulario base quiero tenr algo asi

//Verificar desde Base si hay Otros objetos en el heredado
//por ejemplo
Si Formulario Contiene ContexMenuStrip //desde el Base no se como se
llama el Menu

algo asi es lo que necesito ya que desde el Formulario base no sabre si
existe o no un Menu Contextual en el formulario hijo y mucho menos se el
nombre, es el mismo caso con la coleccion de Control pero esa al
recorrerla tengo acceso a cada uno de los item q le pertenece aunq ellos
solo existan en el heredado, los puedo tratar desde el Base



Pues lo siento, pero yo tampoco sé cómo se puede recorrer la colección de
componentes de un formulario heredado desde el formulario base, sin saber
el nombre del formulario heredado, que en un proyecto se llamará de una
manera y en otro de otra manera diferente.

Lo mismo con técnicas de reflexión se podrá hacer, pero en estos momentos
no caigo.

La verdad que no entiendo muy bien lo que deseas hacer, porque cuando se
hereda de un formulario o de cualquier otra clase, es para ampliar o
extender el formulario o la clase base, de ahí que el formulario base no
tenga por qué preocuparse de lo que ha ampliado o extendido una clase
heredera suya.

Si un formulario heredado se encuentra actualmente abierto, desde el
formulario base puedes obtener una referencia a dicho formulario
utilizando la siguiente función:

public Form ObtenerFormHeredado(string formBaseName)
{

foreach (Form frm in Application.OpenForms)
{
if (frm.GetType().BaseType.Name == formBaseName)
{
return frm;
}
}

return null;

}

En tiempo de ejecución llamarías a la función de la siguiente manera:

// Obtenemos una referencia del formulario
// heredado que actualmente se encuentra abierto.

Form frm = ObtenerFormHeredado("Form1");

if (frm == null){return;}

foreach (Control ctrl in frm.Controls)
{
MessageBox.Show(ctrl.Name);
}

Ahora, a ver cómo te las apañas para referenciar el campo privado
«components» existente en cada formulario, sin saber el nombre del
formulario heredado. :-)


Enrique Martínez
[MS MVP - VB]

Nota informativa: La información contenida en este mensaje, así como el
código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin
garantías de ninguna clase, y no otorga derecho alguno. Usted asume
cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado
o sugerido en el presente mensaje.




Respuesta Responder a este mensaje
#7 SoftJaén
22/10/2009 - 15:34 | Informe spam
"Edilberto Arteaga" escribió:

Ummm pues no me ha quedado mas que hacer mi método virtual y en los
formularios heredados recorrer los componentes que era el punto q
quería evitar a toda costa... el tener que ir a agregar código a los
formularios heredados



Es que no veo yo otra solución, por el motivo de que el formulario base no
tiene por qué saber qué formulario ha heredado de él.

Piensa en que un formulario base puede tener miles de herederos, pero un
heredero, sólo puede tener un único formulario base. :-)

Enrique Martínez
[MS MVP - VB]

Nota informativa: La información contenida en este mensaje, así como el
código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin
garantías de ninguna clase, y no otorga derecho alguno. Usted asume
cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o
sugerido en el presente mensaje.
Respuesta Responder a este mensaje
#8 Alberto Poblacion
22/10/2009 - 17:44 | Informe spam
"Edilberto Arteaga" wrote in message
news:
Ummm pues no me ha quedado mas que hacer mi método virtual y en los
formularios heredados recorrer los componentes que era el punto q
quería evitar a toda costa... el tener que ir a agregar código a los
formularios heredados



Por eso yo te sugería en un mensaje en otro foro la idea de usar
Reflection para acceder al campo privado. Es más complicado, y no muy
eficiente ni elegante, pero tiene la ventaja de que lo puedes hacer una sola
vez en el formulario base sin tener que tocar nada en los heredados.
Respuesta Responder a este mensaje
#9 Edilberto
02/11/2009 - 06:59 | Informe spam
Me he metido con reflexion, pero me ha dado lios llego a los objetos con
FieldInfo

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.






"Alberto Poblacion" wrote
in message news:
"Edilberto Arteaga" wrote in message
news:
Ummm pues no me ha quedado mas que hacer mi método virtual y en los
formularios heredados recorrer los componentes que era el punto q
quería evitar a toda costa... el tener que ir a agregar código a los
formularios heredados



Por eso yo te sugería en un mensaje en otro foro la idea de usar
Reflection para acceder al campo privado. Es más complicado, y no muy
eficiente ni elegante, pero tiene la ventaja de que lo puedes hacer una
sola vez en el formulario base sin tener que tocar nada en los heredados.

Respuesta Responder a este mensaje
#10 Alberto Poblacion
02/11/2009 - 08:23 | Informe spam
"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(...)
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida