MetaC#: Acceso a los componentes de un formulario.

24/11/2005 - 17:18 por José Luis | Informe spam
Hola a todos.

Estoy intentando definir un fichero de configuración xml para, a partir
de él, modificar las propiedades de los objetos que se encuentren en 1
formulario. Esto ya lo he conseguido, pero mi gran sorpresa ha sido ver cómo
determinados controles no se añaden a la lista de controles del formulario,
que no heredan de System.ComponentModel.Component.Control, sino que
provienen de System.ComponentModel.Component...
He visto que el formulario tiene un atributo privado que es un
contenedor de componentes... vale. Soy capaz de recorrer este array y ver
todos los componentes que contiene, pero... ¿cómo sé el nombre que tiene
cada uno de los componentes del array?


Por ejemplo, estoy accediendo a un objeto Timer, de la siguiente manera:

int i =0;
System.ComponentModel.IComponent c = this.components.Components[i];

/* Esto no funciona:

string ctlname = "timerPeso";

System.ComponentModel.IComponent c = this.components.Components[ctlname];

*/

PropertyInfo pi = c.GetType().GetProperty("Interval");

pi.SetValue(c,Convert.ChangeType(Valor,pi.PropertyType),null);



El problema es que al acceder por nombre al array de componentes, el sistema
me devuelve null...

¿Cómo puedo acceder al nombre que le doy al componente al diseñar el
formulario????





Gracias

Preguntas similare

Leer las respuestas

#1 Fernando Callejon
25/11/2005 - 00:46 | Informe spam
Hacelo de la misma forma que le pones la propiedad, con reflection.

Suerte.
Fernando.-

"José Luis" escribió en el mensaje
news:
Hola a todos.

Estoy intentando definir un fichero de configuración xml para, a partir
de él, modificar las propiedades de los objetos que se encuentren en 1
formulario. Esto ya lo he conseguido, pero mi gran sorpresa ha sido ver
cómo determinados controles no se añaden a la lista de controles del
formulario, que no heredan de System.ComponentModel.Component.Control,
sino que provienen de System.ComponentModel.Component...
He visto que el formulario tiene un atributo privado que es un
contenedor de componentes... vale. Soy capaz de recorrer este array y ver
todos los componentes que contiene, pero... ¿cómo sé el nombre que tiene
cada uno de los componentes del array?


Por ejemplo, estoy accediendo a un objeto Timer, de la siguiente manera:

int i =0;
System.ComponentModel.IComponent c = this.components.Components[i];

/* Esto no funciona:

string ctlname = "timerPeso";

System.ComponentModel.IComponent c = this.components.Components[ctlname];

*/

PropertyInfo pi = c.GetType().GetProperty("Interval");

pi.SetValue(c,Convert.ChangeType(Valor,pi.PropertyType),null);



El problema es que al acceder por nombre al array de componentes, el
sistema me devuelve null...

¿Cómo puedo acceder al nombre que le doy al componente al diseñar el
formulario????





Gracias




Respuesta Responder a este mensaje
#2 Fernando Callejon
25/11/2005 - 01:16 | Informe spam
Perdon por haber respondido sin probar, pero me fije como podias
solucionarlo y me encontre con que el timer NO TIENE UNA PROPIEDAD NAME

Timer (introducción)

Constructores públicos
Timer (Constructor)
Compatible con .NET Compact Framework.
Sobrecargado. Inicializa una nueva instancia de la clase Timer.

Propiedades públicas
Container (se hereda de Component) Obtiene IContainer que contiene
Component.
Enabled
Compatible con .NET Compact Framework.
Obtiene o establece si el temporizador está funcionando.
Interval
Compatible con .NET Compact Framework.
Obtiene o establece el tiempo, en milisegundos, entre los pasos de
temporizador.
Site (se hereda de Component)

y si ejecutas esto:

string tmp = "Controles:";

for ( int indx = 0; indx < this.components.Components.Count; indx++ )

{

object ctrl = this.components.Components[ indx ];

ctrl = Convert.ChangeType( ctrl, ctrl.GetType() );

string info = "\t" + ctrl.ToString() + ":";

System.Collections.IEnumerator enu =
ctrl.GetType().GetProperties().GetEnumerator();

while ( enu.MoveNext() )

{

System.Reflection.PropertyInfo pi = (
System.Reflection.PropertyInfo )enu.Current;

object val = pi.GetValue( ctrl, null);

info = String.Format ( "{0}\t{1} = {2}", info, pi.Name,
val.ToString() );

}

info = String.Format ( "{0}\tCan cast to Control = {1}", info, (
ctrl is Control ) ? "SI" : "NO");

tmp = String.Format( "{0}{1}", tmp, info );

}

MessageBox.Show( tmp );

( no es muy prolijo perdon )

Vas a ver que tapoco te la muestra.

La unica solucion que se me ocurre es que uses los timers por index. O
que hagas tu propia implementacion de estos con la propiedad Name incluida.
O hacer una clase que herede de Control y que haga de wrapper a un private
timer.



Suerte.

Fernando.-



"Fernando Callejon" escribió en el mensaje
news:%
Hacelo de la misma forma que le pones la propiedad, con reflection.

Suerte.
Fernando.-

"José Luis" escribió en el mensaje
news:
Hola a todos.

Estoy intentando definir un fichero de configuración xml para, a
partir
de él, modificar las propiedades de los objetos que se encuentren en 1
formulario. Esto ya lo he conseguido, pero mi gran sorpresa ha sido ver
cómo determinados controles no se añaden a la lista de controles del
formulario, que no heredan de System.ComponentModel.Component.Control,
sino que provienen de System.ComponentModel.Component...
He visto que el formulario tiene un atributo privado que es un
contenedor de componentes... vale. Soy capaz de recorrer este array y ver
todos los componentes que contiene, pero... ¿cómo sé el nombre que tiene
cada uno de los componentes del array?


Por ejemplo, estoy accediendo a un objeto Timer, de la siguiente manera:

int i =0;
System.ComponentModel.IComponent c = this.components.Components[i];

/* Esto no funciona:

string ctlname = "timerPeso";

System.ComponentModel.IComponent c = this.components.Components[ctlname];

*/

PropertyInfo pi = c.GetType().GetProperty("Interval");

pi.SetValue(c,Convert.ChangeType(Valor,pi.PropertyType),null);



El problema es que al acceder por nombre al array de componentes, el
sistema me devuelve null...

¿Cómo puedo acceder al nombre que le doy al componente al diseñar el
formulario????





Gracias












begin 666 pubmethod.gif
M1TE&.#EA$ `0`+,``````/____\`_X `@,C(R)"0D"\O+R @(/___P``````
M`````````````````````"'Y! $```@`+ `````0`! ```0Y,,A)J[W8GER/
MV%S@#1\W"B18%,$J'0`!(%#M[X+8!38,;# P3WHHE&@"$(=%A:(I:
%K]8(`#L`
`
end

begin 666 pubproperty.gif
M1TE&.#EA$ `0`*(``````/___P``@,C(R,# P(" @" @(/___R'Y! $```<`
M+ `````0`! ```,\&+K<_I"9.8,0SPS"A[F.!G D2$W#.):8H:@$[)F!6L>Q
=2P/ 8KL+8*.@$ 9<O!HO:32&)*=H)4*M6B$)`#L`
`
end
Respuesta Responder a este mensaje
#3 José Luis
25/11/2005 - 09:22 | Informe spam
Es una solución y no lo es, ya que en el ejemplo estamos trabajando
con un timer, pero probablemente haya más controles que se comporten de esta
manera, y no puedo estar haciendo wrappers para todos. Lo que me resulta
curioso es que, aunque el componente Timer no tenga nombre, el objeto
Collection al que se añaden los componentes, tiene una sobrecarga de
AddNew(object, string), por lo que el framework en la inicialización de los
objetos del formulario no tendría ningún problema en añadir los objetos con
nombre a la colección, para poder recuperarlos luego a través de la
collection usando como índice el nombre del componente, pero no es así.
De todas maneras, estoy convencido de que tiene que haber alguna otra
manera de obtener el nombre del control, pero por muchas vueltas que le doy
no se me ocurre nada.


Gracias

"Fernando Callejon" escribió en el mensaje
news:%
Perdon por haber respondido sin probar, pero me fije como podias
solucionarlo y me encontre con que el timer NO TIENE UNA PROPIEDAD NAME

Timer (introducción)

Constructores públicos
Timer (Constructor)
Compatible con .NET Compact Framework.
Sobrecargado. Inicializa una nueva instancia de la clase Timer.

Propiedades públicas
Container (se hereda de Component) Obtiene IContainer que contiene
Component.
Enabled
Compatible con .NET Compact Framework.
Obtiene o establece si el temporizador está funcionando.
Interval
Compatible con .NET Compact Framework.
Obtiene o establece el tiempo, en milisegundos, entre los pasos de
temporizador.
Site (se hereda de Component)

y si ejecutas esto:

string tmp = "Controles:";

for ( int indx = 0; indx < this.components.Components.Count; indx++ )

{

object ctrl = this.components.Components[ indx ];

ctrl = Convert.ChangeType( ctrl, ctrl.GetType() );

string info = "\t" + ctrl.ToString() + ":";

System.Collections.IEnumerator enu =
ctrl.GetType().GetProperties().GetEnumerator();

while ( enu.MoveNext() )

{

System.Reflection.PropertyInfo pi = (
System.Reflection.PropertyInfo )enu.Current;

object val = pi.GetValue( ctrl, null);

info = String.Format ( "{0}\t{1} = {2}", info, pi.Name,
val.ToString() );

}

info = String.Format ( "{0}\tCan cast to Control = {1}", info,
( ctrl is Control ) ? "SI" : "NO");

tmp = String.Format( "{0}{1}", tmp, info );

}

MessageBox.Show( tmp );

( no es muy prolijo perdon )

Vas a ver que tapoco te la muestra.

La unica solucion que se me ocurre es que uses los timers por index.
O que hagas tu propia implementacion de estos con la propiedad Name
incluida. O hacer una clase que herede de Control y que haga de wrapper a
un private timer.



Suerte.

Fernando.-



"Fernando Callejon" escribió en el mensaje
news:%
Hacelo de la misma forma que le pones la propiedad, con reflection.

Suerte.
Fernando.-

"José Luis" escribió en el mensaje
news:
Hola a todos.

Estoy intentando definir un fichero de configuración xml para, a
partir
de él, modificar las propiedades de los objetos que se encuentren en 1
formulario. Esto ya lo he conseguido, pero mi gran sorpresa ha sido ver
cómo determinados controles no se añaden a la lista de controles del
formulario, que no heredan de System.ComponentModel.Component.Control,
sino que provienen de System.ComponentModel.Component...
He visto que el formulario tiene un atributo privado que es un
contenedor de componentes... vale. Soy capaz de recorrer este array y
ver
todos los componentes que contiene, pero... ¿cómo sé el nombre que tiene
cada uno de los componentes del array?


Por ejemplo, estoy accediendo a un objeto Timer, de la siguiente manera:

int i =0;
System.ComponentModel.IComponent c = this.components.Components[i];

/* Esto no funciona:

string ctlname = "timerPeso";

System.ComponentModel.IComponent c =
this.components.Components[ctlname];

*/

PropertyInfo pi = c.GetType().GetProperty("Interval");

pi.SetValue(c,Convert.ChangeType(Valor,pi.PropertyType),null);



El problema es que al acceder por nombre al array de componentes, el
sistema me devuelve null...

¿Cómo puedo acceder al nombre que le doy al componente al diseñar el
formulario????





Gracias













Respuesta Responder a este mensaje
#4 José Luis
25/11/2005 - 13:15 | Informe spam
Estoy intentando acceder al nombre a través del interfaz ISite (Site.Name),
pero me temo que este nombre no está disponible en tiempo de ejecución,
¿verdad?

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