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

#16 yego
06/06/2005 - 11:46 | Informe spam
Hola Juan,
Quiza tenga el concepto equivocado, pero para mi la variable que he definido
tiene implementado su metodo de lectura, lo cual la convierte en propiedad,
no?, no es asi como se hace?, creo que es sólo el matiz de yo haberla
llamado variable.
Lo he probado tal y como me dices y me funciona perfectamente. Me gusta
muchisimo mas de la forma que tu me indicas. Corrigeme en mi compresión si
es que estoy equivocado: Creamos por cada control que tenemos una interface
que vendrá informada cuando el tenga esta propiedad implementada, y cuando
no tenga dicho control la interfece estará inicializado como null. Algo así?
Te agradezco de verdad las molestias que siempre te tomas.

"Tristan" escribió en el mensaje
news:
> Con respecto a definirme un control como mi interface, no lo entiendo.


Yo
> he
> creado una interface que implementa una variable de solo lectura sease:
> public interface IValorReal
>
> {string ValorReal
>
> { get;}
>
> }

Vamos a ver, si me entero. No se puede exponer una variable en una
interface. Se pueden exponer métodos, propiedades y eventos. Las variables
de hecho no se deben exponer al exterior.

Por lo demás, no solo se puede hacer casting a clases, también se puede
hacer casting a interfaces. Si tus clases implementan la interface
IValorReal, puedes utilizar ((tuObjeto) IValorReal).ValorReal. Por


supuesto,
siempre que ValorReal sea una propiedad.

¿Se comprende hasta aquí?

Si comprendes esto, fíjate bien en el ejemplo que dejé antes para recorrer
los controles. En él, recorro todos los controles del formulario,
comprobando que cumplen la interface, y visualizando la propiedad de la
interface.

Juan Carlos Badiola
MVP - C#


Respuesta Responder a este mensaje
#17 yego
06/06/2005 - 12:02 | Informe spam
Sí, algo así es lo que he hecho, he utilizado los sabios conocimientos de
Tristan. Implementando una interface con una 'propiedad' para todos mis
controles, a la cual accedo cuando el control en el que estoy la tiene.

Muchisimas gracias guille.
"Guillermo 'guille'" escribió en el mensaje
news:%
> 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.

A ver, si lo que quieres es acceder a una propiedad que solo existe en tus
propios controles, ¡de alguna forma tendrás que saber que el control


examinado
es de "los tuyos"!
Y no te estoy diciendo que recorras solo "tus" controles, sino todos los
controles y después hacer la "criba" para solamente examinar los que
"realmente" te interesa examinar.

Algo parecido a lo que te ha contestado Víctor, pero en lugar de un


TextBox,
pues lo haces con el tipo de tu control...

Lo mismo es que no me entero de lo que quieres hacer... en fin... cosas de


la
edad... je, je, je.


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:
> 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.
>
>


Respuesta Responder a este mensaje
#18 Tristan
06/06/2005 - 13:04 | Informe spam
Quiza tenga el concepto equivocado, pero para mi la variable que he definido
tiene implementado su metodo de lectura, lo cual la convierte en propiedad,
no?, no es asi como se hace?, creo que es sólo el matiz de yo haberla
llamado variable.



Ummm, no tengo muy claro lo que quieres decir con esto. La idea es que no se
puede exponer directamente una variable a través de una interface. Es
necesario crear un método de acceso a la variable, ya sea mediante una
propiedad o mediante un método.

Corrigeme en mi compresión si
es que estoy equivocado: Creamos por cada control que tenemos una interface
que vendrá informada cuando el tenga esta propiedad implementada



Bueno, en teoría solo deberías crear una interface para todos tus controles.
Si pretendes acceder a ellos mediante un bucle es señal de que lo que quieres
tratarlos de una forma común. La interface aparentemente debería ser común.

y cuando
no tenga dicho control la interfece estará inicializado como null. Algo así?



Esta parte tampoco me queda demasiado clara. A ver si entiendo bien. Creo
que tu duda es sobre el operador "as".

El operador "as" es un operador de casting. "Convierte" el tipo de un objeto
a otro. No quiero decir que cambie el tipo de un objeto, puesto que eso es
imposible. Lo que hace es informar al compilador de que el objeto apuntado
desde una clase más general, contiene realmente un objeto del tipo de una
clase más específica.

ej:

object o = new TextBox()
o.Text // Error. object no tiene propiedad Text
(o as TextBox).Text // Permite utilizar el objeto como TextBox
(o as Control).Text // Permite " " como Control
o as CheckBox // Devuelve null. "o" no referencia un CheckBox

Observa que "as" no modifica el tipo del objeto, que siempre ha sido
TextBox. Modifica solamente la forma de verlo.

El operador "as" devuelve null cuando el objeto no es realmente de la clase
a la que se intentado hacer casting. En eso me baso en el ejemplo que te puse
el otro dia.

Las interfaces son como una clase base, pero sin código. Por eso se puede
hacer casting de un objeto a las interfaces que implementa. El operador "as"
funciona igual con interfaces que con clases. Cuando el objeto no cumple la
interface devuelve null.

Juan Carlos Badiola Saiz
MVP - C#
Respuesta Responder a este mensaje
#19 yego
06/06/2005 - 13:21 | Informe spam
Sobre este tema creo que lo tengo todo bastante claro, espero no olvidarme
demasiado pronto.

Gracias de nuevo.

"Tristan" escribió en el mensaje
news:
> Quiza tenga el concepto equivocado, pero para mi la variable que he


definido
> tiene implementado su metodo de lectura, lo cual la convierte en


propiedad,
> no?, no es asi como se hace?, creo que es sólo el matiz de yo haberla
> llamado variable.

Ummm, no tengo muy claro lo que quieres decir con esto. La idea es que no


se
puede exponer directamente una variable a través de una interface. Es
necesario crear un método de acceso a la variable, ya sea mediante una
propiedad o mediante un método.

> Corrigeme en mi compresión si
> es que estoy equivocado: Creamos por cada control que tenemos una


interface
> que vendrá informada cuando el tenga esta propiedad implementada

Bueno, en teoría solo deberías crear una interface para todos tus


controles.
Si pretendes acceder a ellos mediante un bucle es señal de que lo que


quieres
tratarlos de una forma común. La interface aparentemente debería ser


común.

>y cuando
> no tenga dicho control la interfece estará inicializado como null. Algo


así?

Esta parte tampoco me queda demasiado clara. A ver si entiendo bien. Creo
que tu duda es sobre el operador "as".

El operador "as" es un operador de casting. "Convierte" el tipo de un


objeto
a otro. No quiero decir que cambie el tipo de un objeto, puesto que eso es
imposible. Lo que hace es informar al compilador de que el objeto apuntado
desde una clase más general, contiene realmente un objeto del tipo de una
clase más específica.

ej:

object o = new TextBox()
o.Text // Error. object no tiene propiedad Text
(o as TextBox).Text // Permite utilizar el objeto como TextBox
(o as Control).Text // Permite " " como


Control
o as CheckBox // Devuelve null. "o" no referencia un


CheckBox

Observa que "as" no modifica el tipo del objeto, que siempre ha sido
TextBox. Modifica solamente la forma de verlo.

El operador "as" devuelve null cuando el objeto no es realmente de la


clase
a la que se intentado hacer casting. En eso me baso en el ejemplo que te


puse
el otro dia.

Las interfaces son como una clase base, pero sin código. Por eso se puede
hacer casting de un objeto a las interfaces que implementa. El operador


"as"
funciona igual con interfaces que con clases. Cuando el objeto no cumple


la
interface devuelve null.

Juan Carlos Badiola Saiz
MVP - C#
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida