Colecciones de controles

02/06/2005 - 11:58 por yego | Informe spam
Hola de nuevo a todos.
Hoy el problema que se me plantea es el siguiente.
Estoy diseñando un formulario base al cual quiero añadir un metodo para
poder recoger los datos de ciertos controles (mis propios controles) de
forma dinamica. La idea que se me ha ocurrido es recorrerme todos los
controles que tenga el formulario e ir comprobando que se tratan de cada uno
de los tipos de mis controles. El caso es que me encuentro con la dificultad
de no poder acceder a la coleccion de controles del formulario y a ninguna
de las propiedades que en todos son distitas.

Alguna solucion mas practica?


Chas gracias.

Preguntas similare

Leer las respuestas

#6 yego
02/06/2005 - 16:46 | Informe spam
Muchas gracias Super Guille.
Estoy tipando en tiempo de ejecucion pero me da un error al compilar. porque
esa coleccion <System.Windows.Forms.Controls> no soporta la propiedad ahora
comun de los controles. Se que se puede resolver diciendo que solo me
recorra los de ese tipo, pero eso no es lo que quiero.
Respecto a la recursividad del metodo, hasta que no solucione lo anterior no
lo podre probar.

Te agradezco un monton tus consejos.


"Guillermo 'guille'" escribió en el mensaje
news:%
si lo que quieres es manipular solo tus controles (o controles de un tipo
determinado), puedes hacer una comprobación del tipo "si el control es de


este
tipo entonces hago lo que tenga que hacer" de esa forma podrás acceder a


las
propiedades que quieras (ya que se supone que esa propiedad está en
determinados controles).

En cuanto a los controles que contienen otros controles, puedes hacer un


método
recursivo, de forma que si el control tiene más controles, lo mandes al


método
que los analiza (el mismo método desde el que lo estás comprobando).

Nos vemos.
Guillermo
Microsoft VB MVP desde 1997
Te invito a mi sitio dedicado al VB y más...
http://www.elguille.info/
http://www.mundoprogramacion.com/
(puede que el correo usado sea anti-spam)


"yego" wrote in message
news:O%
> Si lo he recorrido todos los controles (aqui se plantea otro problema


que es
> que hay controles contenedores de otros controles) y lo que ocurre es


que no
> puedo acceder a cada una de las propidades de los controles
> X ejemplo: 'System.Windows.Forms.Control' no contiene una definición


para
> 'strText'
>
> y asi con cada una de las propiedades por cada uno de los controles que
> tengo (todos con propiedades con distinto nombre).
>
> "Fernán Castro Asensio" escribió en el


mensaje
> news:
>> Has recorrido las coleccions de this.Controls?
>>
>>
>> "yego" escribió en el mensaje
>> news:
>> > Hola de nuevo a todos.
>> > Hoy el problema que se me plantea es el siguiente.
>> > Estoy diseñando un formulario base al cual quiero añadir un metodo


para
>> > poder recoger los datos de ciertos controles (mis propios controles)


de
>> > forma dinamica. La idea que se me ha ocurrido es recorrerme todos los
>> > controles que tenga el formulario e ir comprobando que se tratan de


cada
>> > uno
>> > de los tipos de mis controles. El caso es que me encuentro con la
>> > dificultad
>> > de no poder acceder a la coleccion de controles del formulario y a
> ninguna
>> > de las propiedades que en todos son distitas.
>> >
>> > Alguna solucion mas practica?
>> >
>> >
>> > Chas gracias.
>> >
>> >
>>
>>
>
>


Respuesta Responder a este mensaje
#7 Tristan
02/06/2005 - 19:24 | Informe spam
He hecho una interface comun para obtener el mismo tipo de valor y con el
mismo nombre, pero no avanzo.



Pues es por ahí por donde debes avanzar.

Bueno, yo empezaría diciendote que antes de ponerte a recorrer TODOS los
controles del formulario, eches un vistazo al hilo siguiente al tuyo
"Macrosustiución". No creo que sea demasiado buena solución recorrer todos
los controles de un formulario.

Pero siguiendo con lo que estabas. La solución de la interface es muy buena.
Pero incluso yo en lugar de interfaces, en tu caso utilizaría herencia. Si
todos los objetos que quieres tratar tienen una propiedad strText, puedes
crear una clase base con esa propiedad, a partir de la cual derivar todas tus
clases TextBox. De esta forma cuando hagas el casting a la clase base,
dispondrás de la propiedad.

class TuBaseTextBox: System.Windows.Forms.TextBox
{
public string StrText {...}
}

class TuTextBox1: TuBaseTextBox
{
...
}
...

De esta forma, para recorrer el form y tratar solo tus controles:

TrataTusTextBox(Me.Controls)

void TrataTusTextBox(controles as CollectionControls)
{
foreach (Control control in controles)
{
TuBaseTextBox base = control as TuBaseTextBox;
if (base != null)
MessageBox.Show(base.StrText);
if (control.Controls.Count > 0)
TrataTusTextBox(control.Controls); // Recursividad
}
}

De todas formas, te recomiendo que tal y como digo en el hilo siguiente,
almacenes tus controles en un array, para no tener que recorrer todos una y
otra vez.

Espero que te sirva.
Juan Carlos Badiola Saiz
MVP - C#
Respuesta Responder a este mensaje
#8 Víctor
03/06/2005 - 01:09 | Informe spam
¿Has probado a convertir los controles con "as"? de esta forma sólo tendrías
que comprobar si el valor no es null para tratarlo.

Adjunto un miniejemplo:

foreach(Control c in this.Controls)
{
miControl=c as TextBox;
if(miControl != null) miControl.Text="Texto que deseo";
}

Víctor

"yego" escribió en el mensaje
news:
Muchas gracias Super Guille.
Estoy tipando en tiempo de ejecucion pero me da un error al compilar.
porque
esa coleccion <System.Windows.Forms.Controls> no soporta la propiedad
ahora
comun de los controles. Se que se puede resolver diciendo que solo me
recorra los de ese tipo, pero eso no es lo que quiero.
Respecto a la recursividad del metodo, hasta que no solucione lo anterior
no
lo podre probar.

Te agradezco un monton tus consejos.


"Guillermo 'guille'" escribió en el mensaje
news:%
si lo que quieres es manipular solo tus controles (o controles de un tipo
determinado), puedes hacer una comprobación del tipo "si el control es de


este
tipo entonces hago lo que tenga que hacer" de esa forma podrás acceder a


las
propiedades que quieras (ya que se supone que esa propiedad está en
determinados controles).

En cuanto a los controles que contienen otros controles, puedes hacer un


método
recursivo, de forma que si el control tiene más controles, lo mandes al


método
que los analiza (el mismo método desde el que lo estás comprobando).

Nos vemos.
Guillermo
Microsoft VB MVP desde 1997
Te invito a mi sitio dedicado al VB y más...
http://www.elguille.info/
http://www.mundoprogramacion.com/
(puede que el correo usado sea anti-spam)


"yego" wrote in message
news:O%
> Si lo he recorrido todos los controles (aqui se plantea otro problema


que es
> que hay controles contenedores de otros controles) y lo que ocurre es


que no
> puedo acceder a cada una de las propidades de los controles
> X ejemplo: 'System.Windows.Forms.Control' no contiene una definición


para
> 'strText'
>
> y asi con cada una de las propiedades por cada uno de los controles que
> tengo (todos con propiedades con distinto nombre).
>
> "Fernán Castro Asensio" escribió en el


mensaje
> news:
>> Has recorrido las coleccions de this.Controls?
>>
>>
>> "yego" escribió en el mensaje
>> news:
>> > Hola de nuevo a todos.
>> > Hoy el problema que se me plantea es el siguiente.
>> > Estoy diseñando un formulario base al cual quiero añadir un metodo


para
>> > poder recoger los datos de ciertos controles (mis propios controles)


de
>> > forma dinamica. La idea que se me ha ocurrido es recorrerme todos
>> > los
>> > controles que tenga el formulario e ir comprobando que se tratan de


cada
>> > uno
>> > de los tipos de mis controles. El caso es que me encuentro con la
>> > dificultad
>> > de no poder acceder a la coleccion de controles del formulario y a
> ninguna
>> > de las propiedades que en todos son distitas.
>> >
>> > Alguna solucion mas practica?
>> >
>> >
>> > Chas gracias.
>> >
>> >
>>
>>
>
>






Respuesta Responder a este mensaje
#9 Víctor
03/06/2005 - 01:19 | Informe spam
Perdón, un despiste.

Cambia "miControl=c as TextBox;" por "TextBox miControl=c as TextBox;"


"Víctor" escribió en el mensaje
news:
¿Has probado a convertir los controles con "as"? de esta forma sólo
tendrías que comprobar si el valor no es null para tratarlo.

Adjunto un miniejemplo:

foreach(Control c in this.Controls)
{
miControl=c as TextBox;
if(miControl != null) miControl.Text="Texto que deseo";
}

Víctor

"yego" escribió en el mensaje
news:
Muchas gracias Super Guille.
Estoy tipando en tiempo de ejecucion pero me da un error al compilar.
porque
esa coleccion <System.Windows.Forms.Controls> no soporta la propiedad
ahora
comun de los controles. Se que se puede resolver diciendo que solo me
recorra los de ese tipo, pero eso no es lo que quiero.
Respecto a la recursividad del metodo, hasta que no solucione lo anterior
no
lo podre probar.

Te agradezco un monton tus consejos.


"Guillermo 'guille'" escribió en el mensaje
news:%
si lo que quieres es manipular solo tus controles (o controles de un
tipo
determinado), puedes hacer una comprobación del tipo "si el control es
de


este
tipo entonces hago lo que tenga que hacer" de esa forma podrás acceder a


las
propiedades que quieras (ya que se supone que esa propiedad está en
determinados controles).

En cuanto a los controles que contienen otros controles, puedes hacer un


método
recursivo, de forma que si el control tiene más controles, lo mandes al


método
que los analiza (el mismo método desde el que lo estás comprobando).

Nos vemos.
Guillermo
Microsoft VB MVP desde 1997
Te invito a mi sitio dedicado al VB y más...
http://www.elguille.info/
http://www.mundoprogramacion.com/
(puede que el correo usado sea anti-spam)


"yego" wrote in message
news:O%
> Si lo he recorrido todos los controles (aqui se plantea otro problema


que es
> que hay controles contenedores de otros controles) y lo que ocurre es


que no
> puedo acceder a cada una de las propidades de los controles
> X ejemplo: 'System.Windows.Forms.Control' no contiene una definición


para
> 'strText'
>
> y asi con cada una de las propiedades por cada uno de los controles
> que
> tengo (todos con propiedades con distinto nombre).
>
> "Fernán Castro Asensio" escribió en el


mensaje
> news:
>> Has recorrido las coleccions de this.Controls?
>>
>>
>> "yego" escribió en el mensaje
>> news:
>> > Hola de nuevo a todos.
>> > Hoy el problema que se me plantea es el siguiente.
>> > Estoy diseñando un formulario base al cual quiero añadir un metodo


para
>> > poder recoger los datos de ciertos controles (mis propios
>> > controles)


de
>> > forma dinamica. La idea que se me ha ocurrido es recorrerme todos
>> > los
>> > controles que tenga el formulario e ir comprobando que se tratan de


cada
>> > uno
>> > de los tipos de mis controles. El caso es que me encuentro con la
>> > dificultad
>> > de no poder acceder a la coleccion de controles del formulario y a
> ninguna
>> > de las propiedades que en todos son distitas.
>> >
>> > Alguna solucion mas practica?
>> >
>> >
>> > Chas gracias.
>> >
>> >
>>
>>
>
>










Respuesta Responder a este mensaje
#10 yego
03/06/2005 - 10:11 | Informe spam
Hola Juan,
He buscado el tema del que me hablas y no he visto nada en el MSDN
(Macrosustitucion) cuentame algo mas.
En un principio no puedo generar una clase base puesto que tengo varios
controles diferentes que heredan de otras clases y estan ya muy avanzados.
Lo que si que he hecho es incluir una interface y la he implementado en cada
clase de los controles (pero como Controls no lo tiene definido, siempre me
da error al compilar).
Al final lo he resuelto (aunque no me gusta) definiendo un objeto por cada
uno de los controles que tengo, asi cuando se detecta de que tipo es, se
hace un unboxing del control detectado al objeto del tipo definido
previamente. Con lo cual me da igual haber implementado la interface porque
podria acceder a la propiedad directamente porque ya la reconoce cuando
compilo.([pensamiento] vaya brasas que soy).

Muchas gracias.





"Tristan" escribió en el mensaje
news:
> He hecho una interface comun para obtener el mismo tipo de valor y con


el
> mismo nombre, pero no avanzo.

Pues es por ahí por donde debes avanzar.

Bueno, yo empezaría diciendote que antes de ponerte a recorrer TODOS los
controles del formulario, eches un vistazo al hilo siguiente al tuyo
"Macrosustiución". No creo que sea demasiado buena solución recorrer todos
los controles de un formulario.

Pero siguiendo con lo que estabas. La solución de la interface es muy


buena.
Pero incluso yo en lugar de interfaces, en tu caso utilizaría herencia. Si
todos los objetos que quieres tratar tienen una propiedad strText, puedes
crear una clase base con esa propiedad, a partir de la cual derivar todas


tus
clases TextBox. De esta forma cuando hagas el casting a la clase base,
dispondrás de la propiedad.

class TuBaseTextBox: System.Windows.Forms.TextBox
{
public string StrText {...}
}

class TuTextBox1: TuBaseTextBox
{
...
}
...

De esta forma, para recorrer el form y tratar solo tus controles:

TrataTusTextBox(Me.Controls)

void TrataTusTextBox(controles as CollectionControls)
{
foreach (Control control in controles)
{
TuBaseTextBox base = control as TuBaseTextBox;
if (base != null)
MessageBox.Show(base.StrText);
if (control.Controls.Count > 0)
TrataTusTextBox(control.Controls); // Recursividad
}
}

De todas formas, te recomiendo que tal y como digo en el hilo siguiente,
almacenes tus controles en un array, para no tener que recorrer todos una


y
otra vez.

Espero que te sirva.
Juan Carlos Badiola Saiz
MVP - C#
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida