Acceder a los controles de otro formulario.

19. octubre 2008 12:11 by Oscar.SS in Desarrollo Windows  //  Tags:   //   Comentarios (15)

En ocasiones es necesario acceder a los controles de un formulario desde otro formulario distinto. Por ejemplo, puede darse el caso de dos formularios, "padre e hijo", y que necesitemos escribir un mensaje en un TexBox del formulario "padre" cuando se realiza una determinada acción (evento) desde el formulario "hijo".

En primer lugar debemos crear una instancia del formulario al que queremos acceder. Esta instancia será creada en el lugar que queremos tener el acceso.

Form1 formularioPadre = new Form1();

Luego debes acceder al control deseado por medio de la colección Controls del objeto creado, por ejemplo:

((TextBox)formularioPadre.Controls["nombreDelControl"]).Text = “Texto en un TextBox de otro formulario”;

Como se puede obserbar, es necesaria una conversión (catch) del valor devuelto por la colección Controls al tipo de control adecuado.

La colección Controls esta “indexada”, esto quiere decir que sí lo prefieres puedes acceder a sus elementos por medio de un índice de tipo int (Int32), en lugar de utilizar el nombre del control. Esto es muy apropiado cuando quieres acceder a todos los elementos (controles) en un bucle for() o en una colección propia que guarde objetos de tipo Control.

Es un "truco" muy sencillo pero espero os sirva a más de uno.

 

Nota: Para ayudar a un compañero de los foros MSDN he decidido dejar para descarga un pequeño ejemplo de esta técnica. Se trata tan solo de un ejemplo, de como acceder a las propiedades y métodos de los controles que están situados en otro formulario. Digo esto porque se ha simplificado al máximo, dejando de lado algunas comprobaciones, y resaltando lo que de verdad importa en este caso. 

AccesoControlesForm.zip (44,22 kb)

Solo espero que ahora quede más claro este asunto. Para cualquier problema...aquí estamos Wink


Comentarios (15) -

Rogelio
10/09/2009 6:16:33 #

Gracias al fin lo encuentro despues de añosXD, bueno no tanto pero si tengo tiempo buscando algo asi,
como pregunta, no existe otra forma de cambiar por ejemplo la imagen de un picturebox del formulario padre desde el formulario hijo pero sin tener que instanciar el formulario padre en el hijo.

tmb quisiera preguntar si es buena idea cambiar la propiedad modifier del control label a public en el formulario hijo para poder acceder asus caracteristicas desde el formulario padre.

Gracias de antemano.

victor
20/10/2009 2:00:46 #

esta muy bueno el articulo pero no me funciona... seguro se me paso algo por alto.
sigo tal cual el ejemplo que dejas para descargar pero me sale el siguiente error: "object reference not set to an instance of an object"

El asunto es que sí cree la instancia, como lo hiciste en el ejemplo que dejaste para descargar... capaz no entendi bien en que parte se hace esto.... desde ya gracias por el aporte!

Oscar.SS
20/10/2009 21:38:15 #

@Rogelio.
Perdona no te contestara antes pero por algún motivo se me pasó tu comentario. No es necesario cambiar la propiedad modifier del control, con la colección Controls obtines una referencia al mismo. De todas formas puedes hacerlo así también pero entonces no te hace falta encontrar el control con la colección Controls. O una cosa, o la otra.

@Victor.
Con la poco información que me das solo se me ocurren dos cosas. O has puesto mal la cadena con el nombre del control o has creado una referencia al formulario que no es.

@A todos.
Tenía pendiente desde hace tiempo mejorar este artículo (esta muy pobre) y poner más ejemplos. Gracias a vosotros me animaré a retomar este tema. Espero tener tiempo este fin de semana...¡eso espero!.

Muchas gracias por vuestros comentarios.

aaron corrales
29/07/2010 17:52:55 #

y que tal si fuera alrevez que el formulario hijo tenga que pasar un dato a un controlador del formulario padre?

Oscar.SS
29/07/2010 20:57:39 #

Hola Aaron:

El proceso es el mismo lo hagas en la dirección que lo hagas. Es decir,

1- creamos una instancia del formulario al que queremos pasar los datos,
2- buscamos el objeto sobre el que queremos tener acceso con la colección Controls() de la instancia anterior.

Da lo mismo si es de hijo a padre, o de padre a hijo.

Espero que lo tengas más claro ahora.

Un saludo.

Freddy Medina
10/10/2010 6:48:28 #

Oscar... muchisimas gracias, me costo encontrar un ejemplo asi de especifico como el que tu hiciste... Esta Excelente... muchisimas gracias, era exactamente lo que buscaba...

Saludos...

Oscar.SS
10/10/2010 10:08:15 #

Hola Freddy.

Me alegro mucho de que te gustara y te sirviera de ayuda.

Muchas gracias a ti por el comentario de gratitud Smile

Saludos

yony orosco
15/11/2010 17:14:26 #

amigo he hecho una prueba con tu codigo y no me a funcionado cuando intento llenar un datagriview desde un formulario hijo a un formulario mdi padre esperoque puedas resolver mi inconveniente

Alfredo
12/05/2011 20:58:25 #

Oscar, lo primero que quiero hacer es felicitarte por tu disposicion de compartir tus conocimientos con los demás y pues aprovechando de eso y con relación a este ejemplo, me gustaría saber, si no hay manera de acceder a los controles sin tener que instanciar la forma, pues yo estoy aplicando el ejemplo que nos dás, pero al final termino con las dos formas visibles, la forma base y la instancia, en la base no me aparece el cambio en el textbox y en lnstancia si....bueno, me gustaría si pudieras responderme a mi correo.....te agradezco tu atención y ayuda.....que tengas un excelente día........

Oscar.SS
22/05/2011 11:07:43 #

Hola Alfredo:

Si tenemos un formulario llamado Form1 que contiene un textBox1 y un button1. Y por otro lado tenemos un formulario Form2 que contiene un textBox2 y un button2.

Si lo que queremos hacer es que al pulsar el button1 se abra el Form2, y desde este escribir un texto en su textBox2 que al pulsar sobre el button2 cierre este formulario y pase el texto escrito al textBox1 del Form1, el código sería algo así.

En primer lugar, desde el evento click de button1 en el Form1, instaciamos y mostramos el Form2.


        private void button1_Click(object sender, EventArgs e)
        {
            //Instanciamos el formulario que debemos abrir
            Form2 form2 = new Form2();

            //Mostramos el formulario diciendole que su dueño será el Form1
            form2.Show(this);
        }


Fijate que al método Show() le hemos pasado una instancia del formulario actual (Form1) con la palabra "this". De esta forma estamos indicando que el dueño del Form2 es el Form1.

Y ahora en el evento click del button2 tendríamos el código siguiente. Lo he comentado y fraccionado para que se entienda mejor.


        private void button2_Click(object sender, EventArgs e)
        {
            //Recogemos el valor del texto introducido
            string texto = textBox2.Text;

            //Obtenemos el dueño del Form2
            Form form1 = this.Owner;

            //Obtenemos la caja de texto en Form1
            TextBox cajaTextoForm1 = (TextBox)form1.Controls["textBox1"];

            //Le pasamos el texto introducido
            cajaTextoForm1.Text = texto;

            //Y cerramos el formulario actual, es decir, el Form2
            this.Close();
        }


He fraccionado el código para que se comprenda mejor pero hay 3 lineas de código (2, 3 y 4) que se pueden dejar en una sola siendo algo más elegante.

((TextBox)this.Owner.Controls["textBox1"]).Text = texto;

Espero que esto resuelva tu problema.

Un saludo.

Jhals
30/12/2011 19:41:20 #

Se puede hacer referencias como el último ejemplo que pusiste, pero a controles que estan dentro de "groupBox" ?, si no se puede, hay alguna forma? ya que al intentar hacer como lo que pusiste, me sale objeto no referenciado(null)

Oscar.SS
31/12/2011 9:55:50 #

Hola Jhals.

Ahora mismo no tengo acceso a un VS pero entiendo que tienes que buscar primero el control groupBox en el formulario y luego buscar dentro de este el control que deseas. Ten en cuenta que el método Controls() buscar en la jerarquía de controles, así si los controles están anidados dentro de otros contenedores, hay que hacer búsquedas sucesivas.

GroupBox gb = (GroupBox) form1.Controls["idGroupBox"];

Label lb = (Label) gb.Controls["idLabel"];

Espero que te sea de ayuda.

Un saludo

Daniel
26/02/2012 3:36:59 #

Exelente el articulo...estuve buscando una explicacion tan clara y con un ejemplo, como este que has hecho.
Gracias.
Ahora una consulta, como soy novato en esto, como se haria para acceder no a un control, sino a una funcion de otro form.

josemol
04/05/2012 5:29:46 #

Óscar.. te agradezco mucho .... mejor explicación no hay

Oscar.SS
04/05/2012 7:07:44 #

Josemol, gracias a timpor comentar.

Agregar comentario

  Country flag

biuquote
  • Comentario
  • Vista previa
Loading

Someone Said

La amenaza de la derrota es más terrible que la derrota misma.

Anatoly karpov

Recent Comments

Comment RSS

Month List