System.Reflection

11/08/2004 - 20:50 por Jose Antonio | Informe spam
Tengo un formulario con un control TextBox y quiero acceder a las
propiedades del TextBox por medio de Reflection.



Type t=Formulario.GetType();

System.Reflection.FieldInfo m=t.GetField("textBox1");

System.Reflection.PropertyInfo p=m.FieldType.GetProperty("Text");

// Hasta aqui todo bien m tienen la informacón correcta y p tambien

Al intentar coger el valor de la propiedad Text de textBox1 me salta una
excepcion de TargerException

object o=p.GetValue(m.FieldType,null),

tambien he probado con

object o=p.GetValue(t,null);

¿Alguna sugerencia?



Saludos y gracias.

Preguntas similare

Leer las respuestas

#6 Octavio Hernandez
12/08/2004 - 22:35 | Informe spam
Qué tal, Rodrigo! Siempre un placer poder saludarte...
Creo que todavía mejor quedaría:

Control c = this.Controls.Find("textBox1", true)[0];

dado que se trata de controles, como dice Jose Antonio.

Las vacaciones - ¿ya o todavía?

Un abrazo - Octavio

"Rodrigo Corral [MVP]" escribió en el mensaje
news:
El codigo del amigo Octavio sirve perfectamente a tus propositos,
simplemente sustituye

TextBox tb = (TextBox) this.Controls.Find("textBox1", true)[0];

por

object tb = this.Controls.Find("textBox1", true)[0];


Un saludo
Rodrigo Corral González [MVP]

microsoft.public.es.vc FAQ
http://vcfaq.europe.webmatrixhosting.net


Respuesta Responder a este mensaje
#7 Octavio Hernandez
12/08/2004 - 22:38 | Informe spam
JA,

Lo que tengo instalado aquí es la beta de VS2005, a ver si se trata de un
método que no existe en .NET 1.1...
En todo caso, podrías programar la función, recorriendo la colección de
controles y buscando el que tenga el nombre adecuado...

Salu2 - Octavio

"Jose Antonio" escribió en el mensaje
news:OgH$
TextBox tb = (TextBox) this.Controls.Find("textBox1", true)[0];

esta linea me da error
'System.Windows.Forms.Control.ControlCollection' no contiene una


definición
para 'Find'
¿ahi que añadir alguna referencia?



"Jose Antonio" escribió en el mensaje
news:%
> Cierto, gracias a los dos.
>
> Saludos
> "Rodrigo Corral [MVP]" escribió en el mensaje
> news:
> > El codigo del amigo Octavio sirve perfectamente a tus propositos,
> > simplemente sustituye
> >
> > TextBox tb = (TextBox) this.Controls.Find("textBox1", true)[0];
> >
> > por
> >
> > object tb = this.Controls.Find("textBox1", true)[0];
> >
> >
> > Un saludo
> > Rodrigo Corral González [MVP]
> >
> > microsoft.public.es.vc FAQ
> > http://vcfaq.europe.webmatrixhosting.net
> >
> >
>
>


Respuesta Responder a este mensaje
#8 Javier Ros
13/08/2004 - 09:25 | Informe spam
No, creo estar seguro de que en VS2003 no se puede referenciar un objeto
por el nombre. Estuve buscando esa posibilidad hace tiempo y no la encontré,
al verlo en este thread me sorprendio. A no ser que sea usando reflexión,
creo
que la funcion Find(string ComponentName, ...) no existe.

Saludos,


Javier Ros Moreno
Aguas de Murcia
Murcia (España)


"Octavio Hernandez" escribió en el mensaje
news:%
JA,

Lo que tengo instalado aquí es la beta de VS2005, a ver si se trata de un
método que no existe en .NET 1.1...
En todo caso, podrías programar la función, recorriendo la colección de
controles y buscando el que tenga el nombre adecuado...

Salu2 - Octavio

"Jose Antonio" escribió en el mensaje
news:OgH$
> TextBox tb = (TextBox) this.Controls.Find("textBox1", true)[0];
>
> esta linea me da error
> 'System.Windows.Forms.Control.ControlCollection' no contiene una
definición
> para 'Find'
> ¿ahi que añadir alguna referencia?
>
>
>
> "Jose Antonio" escribió en el mensaje
> news:%
> > Cierto, gracias a los dos.
> >
> > Saludos
> > "Rodrigo Corral [MVP]" escribió en el


mensaje
> > news:
> > > El codigo del amigo Octavio sirve perfectamente a tus propositos,
> > > simplemente sustituye
> > >
> > > TextBox tb = (TextBox) this.Controls.Find("textBox1", true)[0];
> > >
> > > por
> > >
> > > object tb = this.Controls.Find("textBox1", true)[0];
> > >
> > >
> > > Un saludo
> > > Rodrigo Corral González [MVP]
> > >
> > > microsoft.public.es.vc FAQ
> > > http://vcfaq.europe.webmatrixhosting.net
> > >
> > >
> >
> >
>
>


Respuesta Responder a este mensaje
#9 Octavio Hernandez
15/08/2004 - 10:52 | Informe spam
Javier,

Esto funciona perfectamente en VS2003:

for (int i = 0; i < Controls.Count; i ++)
if (Controls[i].Name == "button1") // el control que te interese
MessageBox.Show("Localizado!");

Slds,

Octavio

"Javier Ros" $PAMHEREemuasa.es> escribió en el mensaje
news:
No, creo estar seguro de que en VS2003 no se puede referenciar un objeto
por el nombre. Estuve buscando esa posibilidad hace tiempo y no la


encontré,
al verlo en este thread me sorprendio. A no ser que sea usando reflexión,
creo
que la funcion Find(string ComponentName, ...) no existe.

Saludos,


Javier Ros Moreno
Aguas de Murcia
Murcia (España)


"Octavio Hernandez" escribió en el mensaje
news:%
> JA,
>
> Lo que tengo instalado aquí es la beta de VS2005, a ver si se trata de


un
> método que no existe en .NET 1.1...
> En todo caso, podrías programar la función, recorriendo la colección de
> controles y buscando el que tenga el nombre adecuado...
>
> Salu2 - Octavio
>
> "Jose Antonio" escribió en el mensaje
> news:OgH$
> > TextBox tb = (TextBox) this.Controls.Find("textBox1", true)[0];
> >
> > esta linea me da error
> > 'System.Windows.Forms.Control.ControlCollection' no contiene una
> definición
> > para 'Find'
> > ¿ahi que añadir alguna referencia?
> >
> >
> >
> > "Jose Antonio" escribió en el mensaje
> > news:%
> > > Cierto, gracias a los dos.
> > >
> > > Saludos
> > > "Rodrigo Corral [MVP]" escribió en el
mensaje
> > > news:
> > > > El codigo del amigo Octavio sirve perfectamente a tus propositos,
> > > > simplemente sustituye
> > > >
> > > > TextBox tb = (TextBox) this.Controls.Find("textBox1", true)[0];
> > > >
> > > > por
> > > >
> > > > object tb = this.Controls.Find("textBox1", true)[0];
> > > >
> > > >
> > > > Un saludo
> > > > Rodrigo Corral González [MVP]
> > > >
> > > > microsoft.public.es.vc FAQ
> > > > http://vcfaq.europe.webmatrixhosting.net
> > > >
> > > >
> > >
> > >
> >
> >
>
>


Respuesta Responder a este mensaje
#10 Pedro Luna Montalvo \(MVP\)
18/08/2004 - 17:00 | Informe spam
Esto funciona, claro, siempre y cuando el control esta a nivel de Form
Si se encuentra dentro de un GroupBox o un Panel.no lo encuentra,
cierto? ;)

Te incluyo una alternativa al FindControl().

private Control FindControl(Control.ControlCollection controls, string
controlName) {
foreach(Control control in controls) {
if (control.Name == controlName) {
return control;
}

Control childControl = this.FindControl(control.Controls,
controlName);
if (childControl != null) {
return childControl;
}
}
return null;
}

private Control FindControl(string controlName) {
return this.FindControl(this.Controls, controlName);
}


Agrega estos dos metodos en tu formulario, y puedes invocar:

this.FindControl("textBox1") para recuperar el Control.


Saludos
Pedro Luna, MVP
Gye, Ecu

"Octavio Hernandez" escribió en el mensaje
news:%
Javier,

Esto funciona perfectamente en VS2003:

for (int i = 0; i < Controls.Count; i ++)
if (Controls[i].Name == "button1") // el control que te interese
MessageBox.Show("Localizado!");

Slds,

Octavio

"Javier Ros" $PAMHEREemuasa.es> escribió en el mensaje
news:
> No, creo estar seguro de que en VS2003 no se puede referenciar un


objeto
> por el nombre. Estuve buscando esa posibilidad hace tiempo y no la
encontré,
> al verlo en este thread me sorprendio. A no ser que sea usando


reflexión,
> creo
> que la funcion Find(string ComponentName, ...) no existe.
>
> Saludos,
>
>
> Javier Ros Moreno
> Aguas de Murcia
> Murcia (España)
>
>
> "Octavio Hernandez" escribió en el mensaje
> news:%
> > JA,
> >
> > Lo que tengo instalado aquí es la beta de VS2005, a ver si se trata de
un
> > método que no existe en .NET 1.1...
> > En todo caso, podrías programar la función, recorriendo la colección


de
> > controles y buscando el que tenga el nombre adecuado...
> >
> > Salu2 - Octavio
> >
> > "Jose Antonio" escribió en el mensaje
> > news:OgH$
> > > TextBox tb = (TextBox) this.Controls.Find("textBox1", true)[0];
> > >
> > > esta linea me da error
> > > 'System.Windows.Forms.Control.ControlCollection' no contiene una
> > definición
> > > para 'Find'
> > > ¿ahi que añadir alguna referencia?
> > >
> > >
> > >
> > > "Jose Antonio" escribió en el mensaje
> > > news:%
> > > > Cierto, gracias a los dos.
> > > >
> > > > Saludos
> > > > "Rodrigo Corral [MVP]" escribió en el
> mensaje
> > > > news:
> > > > > El codigo del amigo Octavio sirve perfectamente a tus


propositos,
> > > > > simplemente sustituye
> > > > >
> > > > > TextBox tb = (TextBox) this.Controls.Find("textBox1", true)[0];
> > > > >
> > > > > por
> > > > >
> > > > > object tb = this.Controls.Find("textBox1", true)[0];
> > > > >
> > > > >
> > > > > Un saludo
> > > > > Rodrigo Corral González [MVP]
> > > > >
> > > > > microsoft.public.es.vc FAQ
> > > > > http://vcfaq.europe.webmatrixhosting.net
> > > > >
> > > > >
> > > >
> > > >
> > >
> > >
> >
> >
>
>


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