Acceder a los controles de otro formulario.

19. October 2008 12:11 by Oscar.SS in Desarrollo Windows  //  Tags:   //   Comments (22)

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


Comments (22) -

Rogelio
Rogelio
9/10/2009 6:16:33 AM #

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
victor
10/20/2009 2:00:46 AM #

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
Oscar.SS
10/20/2009 9:38:15 PM #

@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
aaron corrales
7/29/2010 5:52:55 PM #

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

Oscar.SS
Oscar.SS
7/29/2010 8:57:39 PM #

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
Freddy Medina
10/10/2010 6:48:28 AM #

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
Oscar.SS
10/10/2010 10:08:15 AM #

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
yony orosco
11/15/2010 5:14:26 PM #

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
Alfredo
5/12/2011 8:58:25 PM #

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
Oscar.SS
5/22/2011 11:07:43 AM #

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
Jhals
12/30/2011 7:41:20 PM #

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
Oscar.SS
12/31/2011 9:55:50 AM #

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
Daniel
2/26/2012 3:36:59 AM #

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
josemol
5/4/2012 5:29:46 AM #

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

Oscar.SS
Oscar.SS
5/4/2012 7:07:44 AM #

Josemol, gracias a timpor comentar.

jason
jason
6/6/2012 9:59:50 PM #

quisiera saber como hago cuando utilizo un formulario mdiContainer,, me sale un error, muchas gracias excelente tu ejemplo muchas gracias desde colombia

Oscar.SS
Oscar.SS
6/7/2012 8:12:18 PM #

Hola Jason:

¿Que error te sale?. Si me das más información de lo que deseas hacer y el error que tienes podré ayudarte mejor.

De todas formas te dejo un enlace por si esto te ayuda:

stackoverflow.com/.../access-to-the-elements-of-parent-form-from-child-in-mdi

Un saludo

Gustavo
Gustavo
8/23/2012 4:29:09 AM #

Hola oscar como estas? te felicito por tu bloq. Me parecion muy interesante y util la informacion que brindas pero tengo un problema. Te explico: Tengo 2 formularios, uno es MDI y el otro no lo es. En el formulario MDI al que llame "PadreForm" tengo 2 toolstrip. Lo que intento es que desde el otro formulario (que NO es hijo de PadreForm), intento cambiar la propiedad "enabled" de estos toolstrip a "true" pero no lo consigo.

Te muestro el codigo:

namespace WindowsFormsApplication1
{
    public partial class SesionForm : Form
    {
       PadreForm botones=new PadreForm();
        
        public SesionForm()
        {
            InitializeComponent();
          
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //menulateral es el toolstrip cuya propiedad intento cambiar de estado.

            ToolStrip objeto = (ToolStrip)botones.Controls["menulateral"];

            objeto.Items["facturacion_tbtn"].Enabled = true;

        
        }
    }
}
Al correr la aplicacion, ambos formularios deben aparecer.
Al presionar el boton no pasa nada...

Espero tu respuesta.

diego estena
diego estena
11/13/2012 12:07:30 AM #

hola oscar me ayudastes mucho con l tema de los forms y queria saber como hago para cambiar l nombre de la ventana de un form mdi desde otro formulario form llamado configuracion

x ejemplo
mdi tiene el nombre de "principal"...
ahora desde el form configuracion quisiera ver si se puede cmabiar ese nombre de la ventana

de antemano muchas gracias m ayuda full xq es mi trabajo de grado

Cesar
Cesar
1/9/2013 12:55:20 AM #

Gracias hermano, fue de gran ayuda... Muy oportuno

Oscar.SS
Oscar.SS
1/9/2013 9:25:24 AM #

Gracias a ti Cesar por comentar!!

Mariana
Mariana
3/4/2013 4:01:57 PM #

Hola Oscar espero me puedas ayudar en el siguiente problema,
Tengo el siguiente problema tengo un formulario que no esta en el master page y necesito que el valor de uno de sus textbox lo invoque o lo traiga al textbox de un masterpage. Todo esto es en asp.net

De antemano le agradezco mucho.

Recent Comments

Comment RSS

Month List