Developer's Diary

5 diciembre, 2010

Curso C# – Varios Formularios

Buenas.

Tras  un tiempo sin publicar nada, vuelvo a retomar el curso de c#. Si te has perdido el resto de cursos solo tienes que darte una vuelta por el blog para comprobar las anteriores entregas del mismo.

En esta entrega, vamos a continuar con la programación visual y vamos a crear varios formularios para poder trabajar entre ellos.

(more…)

Como ya bien indicamos en anteriores entregas, un formulario es la clase primigenia para nuestras aplicaciones de Windows Forms. Siempre que creemos un nuevo proyecto de aplicación en ventana, nos creara a su vez un objeto de tipo Form1.

Un formulario no deja de ser una clase, pregenerada por Visual Studio. Si nos fijamos detalladamente este tipo de clase esta compuesto por varios ficheros con el mismo nombre. Esto se debe a que para un mayor orden del código se ha separado el diseño, nuestro fichero que contiene la extensión .designer, del código que será nuestro formulario original. Esta separación se da a partir de Visual Studio 2005, por eso, si tenemos algún proyecto de una versión anterior, podremos ver como hay una región denominada «Creada por el diseñador de windows forms», lo incluido ahí, es lo que anteriormente podíamos ver en el fichero .designer.

Ahora bien, trabajar con varios formularios no es excesivamente dificil, solamente, debemos marcar dentro de nuestro proyecto con el botón derecho,  windows forms. Como puede verse en la imagen. Posteriormente nos aparecerá un formulario indicando que nombre queremos poner a nuestro nuevo archivo y a partir de ahí, tendremos un nuevo formulario.

Un apartado importante cuando tenemos un proyecto con varios formularios es la configuración del proyecto. Si volvemos a pulsar con el botón derecho sobre el proyecto y seleccionamos la opción de propiedades, se nos abrirá una ventana con opciones como la siguiente:

Aunque desde la ventana de propiedades del proyecto, podemos modificar bastantes aspectos de nuestra aplicación. En esta ocasión vamos a quedarnos solamente con la primera pestaña. Desde ahí, podemos ver el nombre del ensamblado y del proyecto, el icono de nuestra aplicación, la versión del framework que vamos a usar, etc. Podemos jugar con esos valores, pero quería que hicieramos hincapié en el elemento que pone objeto de inicio.

Si desplegamos el cuadro de dialogo, nos saldrá las opciones de Sin establecer y el fichero de Program. Si estuviesemos usando Visual Basic, nos saldrían cada uno de los formularios que hayamos creado y como queremos cerrar nuestra aplicación, cuando se cierre el último formulario o cuando se cierre el formulario general. Pero ahora mismo, estamos en C# y si nos digirimos al fichero de program pregenerado por el Ide veremos las siguientes líneas:

Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());

Nos vamos a quedar con la última línea. Application.Run(new Form1());. Que viene a decir, que nuestra aplicación cargue el formulario Form1. Si modificamos esa línea y pusiesemos Form2. Se ejecutaría el formulario que tuviesemos como nuestro segundo.  Pero, no solo se encarga de lanzar nuestro formulario, si no también de indicar nuestro formulario principal, es decir, si el formulario que aparece indicado en el fichero de Program es cerrado, se terminará nuestra aplicación. ¿Por qué ocurre esto? Por una razón muy sencilla, realmente el archivo Program de nuestra aplicación no deja de ser el Main de la misma. Por lo cual, este llama o arranca, con el método Run nuestro formulario indicado y lo deja cargando. Si este finaliza, como por ejemplo, cuando lo cerramos, pasaremos de esa sentencia a la siguiente. Como, no hay más líneas, implica que nuestra aplicación ha finalizado.

Partiendo de ese hecho, siempre tendremos un formulario principal y si cerramos tal formulario la aplicación terminara. Si, es así, aunque puede modificarse el código para evitar que se pueda cerrar la aplicación, cuando el formulario principal sea cerrado, que podremos explicar en posteriores entregas. No obstante, la lógica de la aplicación es que trabajemos sobre una ventana o formulario y tras este vayamos generando nuevos.

Después de aprender un poco, como funciona nuestra aplicación con ventanas, pasaremos a trabajar con varios formularios. Trabajar con varios formularios es algo completamente sencillo y fácil de hacer. Para el ejemplo inicial, vamos a tomar el proyecto que estabamos usando e introduciremos un botón en el Form1.  Dentro del evento de clicado de ese botón, haremos lo siguiente, instanciaremos nuestro nuevo formulario y lo mostraremos.

Dentro de .Net existen dos maneras para mostrar un nuevo formulario, podemos mostrarla con el método Show o con el método ShowDialog. La diferencia entre ambos, es que el segundo mostrara el formulario en dialogo, es decir, no nos permitirá trabajar con el resto de la aplicación hasta que hayamos finalizado con ese formulario. Este segundo método resulta más que recomendable para esperamos datos de este segundo formulario para el principal, pero en el caso de que queramos mostrar información, solo será necesario usar el método Show y que el resto de la aplicación continúe funcionando.

La manera de hacer mostrar otro formulario sería con las siguientes líneas de código.

Form2 nuevo_formulario = new Form2();

nuevo_formulario.Show();

Resulta completamente sencillo, verdad, solo debemos instanciar nuestro formulario y posteriormente mostrarlo. La dificultad comienza en otro momento. ¿Que ocurre cuando queremos pasar información entre ambos formularios?

Cuando comencé a estudiar programación y usaba .Net, esa duda me resultaba dolorosa, ya que no terminaba de encontrar el método más adecuado para pasar información desde un formulario a otro. En el fondo, son piezas completamente independientes.  Para esta respuesta, hay varias maneras de poder solucionarlo, sin generar demasiado descontrol en la aplicación , diseño y mantenimiento de la misma y si alguien conoce alguna más estoy dispuesto a escucharle en los comentarios.

El primer método que podemos usar, es teniendo propiedades publicas entre formularios, simplemente deberíamos crear una variable global para ese formulario y darle la privacidad publica. De esa manera podemos acceder desde otro formulario sin ningún tipo de problema. Nos pararemos a detallar las maneras de armar una clase un poco más adelante en el curso. Pero para generar una propiedad solo tendríamos que poner dentro de la declaración del formulario lo siguiente.

public (tipo de variable) (nombre de variable)

El segundo método, para poder pasar información entre formularios, es usando una clase estática y con propiedades publicas. Teniendo los parametros de accesibilidad de la clase bien definidos. Podemos tener una clase contenedora de valores, que vaciaremos en ciertos momentos.  Me parare más tranquilamente a mostrar como crear una clase de estas caracteristicas cuando lleguemos a construir una clase dentro del curso.

Un tercer método que nos permite enviar datos de un formulario a otro, es sobrecargando el método Show(), introduciendo el valor de las variables, no obstante, debemos tener sumo cuidado al sobrecargar este método. Ya que, debemos llamar al propio show de la clase para que finalmente se muestre tras realizar nuestras tareas.

Hasta aquí, nuestro apartado de como crear nuestra aplicación con multiples formularios. En proximos cursos os mostraré de que manera podemos crear clases que nos permitan una mejor manera de poder usar nuestras clases y a partir de ahí, poder realizar aplicaciones potentes.

Un saludo y ante cualquier duda, solo debeis comentar para realizar vuestras consultas.

9 comentarios »

  1. Gracias hermano, precisamente eso era lo que que estaba buscando ahora. el como hacer que mi aplicación levantara por otro formulario y no por form1, que es que cuando ya tenia la aplicación hecha me pareció que no era la mas indicada para ser la primera cara del programa y no quería hacer otra aplicación y tener que estar copiando el código de nuevo.
    gracias.
    es verdad que Internet es lo máximo.

    Comentarios por michel — 6 diciembre, 2010 @ 8:33 PM

    • Me alegro que te sirviese. Espero que sigas visitando el blog para cualquier duda que te vaya surgiendo.

      Un saludo.

      Comentarios por 3nk1 — 7 diciembre, 2010 @ 11:10 AM

  2. […] de control. – Estructuras de repetición. – Manejo de los controles básicos I , II , III. – Varios formularios – Tipos de datos. – Creación de clases. – Creación de clases II. – Control de ficheros. – Control […]

    Pingback por Curso C# « Developer's Diary — 3 enero, 2011 @ 7:31 AM

  3. Hola bro mira el problema que yo tengo es el siguiente quiero tener 2 formularios en el form1 quiero tener un boton y una caja de texto. el boton llamara al form2 donde tengo 2 cajas de texto en una coloco el nombre y en otra la edad, bien tengo un boton que quiero que le mande esos 2 datos a mi caja de texto del form1

    Comentarios por Arturo — 30 marzo, 2011 @ 6:13 AM

    • Es muy sencillo Arturo, de hecho en otro post comentamos como pasar variables de un lado a otro.

      Para algo tan sencillo, solo debes crearte propiedades publicas en el formulario dos, por ejemplo. Te recomiendo que cuando vayas a mostrar el formulario2, lo hagas con el método ShowDialog. Porque de esa manera, no continuarás trabajando con el anterior formulario hasta que termines con los datos de este.

      Entonces, supongo que en el form2 tienes un botón aceptar o cancelar. Solo tienes que igualar los valores de esas cajas de texto, a las propiedades para luego recuperarlas en tu formulario1. Si muestras con ShowDialog, no continuara la ejecución desde el form1.

      Por lo tanto desde la llamada del formulario2 en el form1 solo tienes que llamar a las propiedades que has creado y recoger esos datos.

      Espero haber respondido tu pregunta.

      Saludos.

      Comentarios por 3nk1 — 30 marzo, 2011 @ 12:43 PM

  4. Buenas noches, tengo una duda sobre trabajar con mas de un formulario a la vez en Visual C#, y es la siguiente:

    Ya cree los dos formularios que necesito para desarrollar el proyecto, y ya tienen sus correspondientes herramientas (label, textBox, etc.), el problema se presenta en que necesito que los datos que se llenan en el form1 sean llamados desde el form2, sin necesidad de volver a escribirlos en los textbox del segundo formulario. Ambos formularios tienen los mismos label y textbox, por supuesto los nombres de los textbox son distintos en los dos formularios. Intente hacerlo con el siguiente codigo, sin embargo solo me funciona con un textbox, aunque intente crear otras variables no las acepta, me da error. Soy nueva trabajando en este lenguaje. Gracias de antemano, feliz noche…

    En el FORM1:

    private void button1_Click(object sender, EventArgs e)
    {
    Form2 ventana2 = new Form2();

    ventana2.Show();

    Variable = textBox1.Text;

    }

    En el FORM2:

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
    textBox2.Text = Form1.Variable;

    }

    Comentarios por Nancy Paredes — 3 enero, 2012 @ 11:16 PM

    • Por lo que veo está bien lo que creas Nancy. Lo que me llama la atención es que introduces esa variable desde el evento TextChanged, no creo que sea el evento adecuado para introducir el valor de la variable, porque va a requerir que se modifique el texto del textbox para que se cambie la variable.

      Yo te recomendaría que fuese dentro del evento Load del formulario dos, dentro del formulario uno tienes que crear tantas variables como valores quieras pasar, puedes llegar a usar una estructura o una clase para que te resulte más cómodo.

      Entonces el evento Load del formulario 2 quedaría similar a este:

      private void Form2_Load(object sender , EventArgs e)
      {
      textBox2.Text = Form1.VariableTextBox2;
      textbox1.Text = Form1.VariableTextBox1;
      }

      Si lo que quieres es que se complete en ambos formularios a la misma vez, tienes que hacer lo siguiente. Debes crear el formulario 2 como privada, eso requiere que sea dentro de la declaración del formulario1, similar a esto.

      Public Form1
      {
      private miForm2 = new Form2();

      //Las declaraciones pertinentes.

      }

      Para que se cambien en tiempo real, tienes que incluir los eventos textChanged de los textbox del formulario 1. Imagina que el textbox1 del Form1 se asocia con el textbox1 del Form2. Tendrías que poner dentro de la ventana de propiedades del textbox1 del Form2 como publico y poner el siguiente código dentro del evento de TextChanged del form1.

      private void textBox1_TextChanged(object sender , EventArgs e)
      {
      miForm2.Textbox1.Text = this.Textbox1.Text;
      }

      Cuando vayas a abrir el formulario 2, van a aparecerte los valores que ya hayas introducido dentro del textbox1 del formulario 1.

      Puede resultarte algo lioso, pero no te desanimes y si tienes alguna duda más, solo tienes que preguntar en los comentarios.

      Un saludo.

      Comentarios por 3nk1 — 4 enero, 2012 @ 8:54 AM

  5. si creo un meno que me envie a otro formulario, y tengo un boton que me regrese al menu como le ago para que al ir y regresar del menu al formulario no me aparescan tantas ventanas en la barra de tareas..de windows

    Comentarios por frank — 4 octubre, 2012 @ 1:34 PM

    • Buena pregunta frank. Estaba buscando como ayudarte para agrupar las ventanas en el mismo recuadro, pero no encuentro nada, porque creo que es una función que realiza automaticamente Windows. No obstante, lo más lógico también es que después de realizar las operaciones pertinentes en esa ventana la cierres tu usando el método this.Close(). Ya que toda la información que puedas necesitar de esa ventana la puedes almacenar en alguna de tus clases.
      No sé si con estas dos ideas logro solventar tu duda en caso que quieras ampliar algo más de información, solo comentalo en el foro.

      Un saludo.

      Comentarios por 3nk1 — 4 octubre, 2012 @ 8:57 PM


RSS feed for comments on this post. TrackBack URI

Deja un comentario