Marc Rubiño

ASP.NET, C#, AJAX.NET, JavaScript, etc.

Cerrar el formulario Principal sin cerrar la aplicación C#

En el foro de MSDN ha habido un pique sano sobre los lenguajes de programación VB.Net Vs C# yo como representante de los de ; quiero responder al reto de poder cerrar el formulario principal de una aplicación Windows sin cerrar la aplicación entera  ni ocultar este formulario.

 

Mi propuesta es:

 

Toda aplicación Windows empieza por la función Main() que es la entrada de la aplicación y la encargada de lanzar el formulario principal.

  

Entonces que pasaría si no abrimos directamente el formulario y solo abrimos el contexto para la aplicación?

 ApplicationContext (Clase)

Especifica información contextual sobre un subproceso de aplicación.

Espacio de nombres: System.Windows.Forms

 

Primero crearemos la clase que utilizaremos para manejar los formularios

 

 

Lo más importante es que herede de ApplicationContext para poderla utilizar para arrancar la aplicación.

 

Crearemos un par de formularios para demostrar la funcionalidad.

 

 

Finalmente en la entrada de la la aplicación utilizaremos nuestra clase personalizada.

 

 

Y ya podemos cerrar los formularios que queramos que la aplicación sigue funcionando. Solo nos quedaría mejorar nuestra clase para saber si tenemos todos los formularios cerrados terminar con la aplicación.

 

Os adjunto el ejemplo y espero el siguiente reto de los de VB ;-).

 

Reto Foro MSDN

 

Saludos.

Posted: 17/4/2008 17:40 por Marc Rubiño | con 23 comment(s) |
Archivado en: ,
Comparte este post:

Comentarios

Juan Carlos González Martín ha opinado:

Je Je..a ver lo que tarda Toni Recio en replicarte...muy bueno el ejemplo.

Un saldo

JC's

p.d:mmm no se, pero en el ambiente se palpa que C#...

# April 17, 2008 7:56 PM

PabloNetrix ha opinado:

Vale, mu bien, mu bonico, pero... y ahora, ¿cómo cierras la aplicación? xD

Saludos

# April 17, 2008 9:13 PM

Marc Rubiño ha opinado:

Jejeje, Toni se esta quedando sin recursos !!!

Los de VB no tienen nada que hacer. :-)

# April 17, 2008 9:27 PM

Marc Rubiño ha opinado:

PabloNetrix !!!!

Realmente no tienes imaginación !!! XD

En el mismo punto que se crea la aplicación la clase estática "Program", creas un método estático para cerrar la aplicación.

public static void Close()

{  

  Application.Exit();

}

Desde cualquier formulario de tu aplicación o desde la clase que administras todos los formularios la puedes llamar para terminar con la aplicación.

private void button1_Click(object sender, EventArgs e)

{

 Program.Close();

}

Y ya lo tienes solucionado. ;-)

# April 17, 2008 9:46 PM

Romny ha opinado:

Realmente este reto no tiene ciencia, en la documentacion esta, creo que falta leer.

# April 18, 2008 2:38 AM

Marc Rubiño ha opinado:

Hola Romny,

Este reto no pretende descubrir nada nuevo, tan solo responder una consulta que hacia mucho tiempo nadie había dado una solución en los foros de MSDN.

Estoy totalmente de acuerdo que hay mucha gente en los Foros que no se molesta ni en mirar la documentación. Pero para la gente que queremos aportar y ponemos nuestro granito ya sea en un blog o en los foros no nos tira para atrás esta situación y seguimos aportando con lo que podemos.

Compartir conocimientos siempre es una buena opción.

Saludos.

# April 18, 2008 9:38 AM

Juan Carlos Ruiz Pacheco ha opinado:

Un articulo muy interesante, como los que me gustan!!!

Te enlazare a mi blog.

saludos

# April 24, 2008 7:45 PM

Vangoth ha opinado:

Hola de pelicula esta opcion, yo soy novato en lo que es programacion C sharp express, y me ha ayudado bastante este articulo Gracias... ;-)

# April 25, 2008 9:45 AM

Marc Rubiño ha opinado:

Gracias a todos !!!

Yo ya estoy contento si le ha servido de ayuda a alguien el ejemplo. ;-)

Saludos.

# April 29, 2008 7:53 PM

Fabio ha opinado:

Hola que tal.. che disculpen que molesto.. pero creo que segui los pasos tal cual y no me funciona ... si se podria adjuntar un proyecto donde esten los formularios con el código muchisimas gracias... fabioragusa@hotmail.com

gracias nuevamente !

# September 27, 2008 7:56 AM

Duncan ha opinado:

Excelente articulo.

saludos

# October 10, 2008 4:16 AM

Ricardo ha opinado:

Creo que te faltaria algo,

si la persona cierra el formulario desde la x superior  

la aplicacion seguiria en memoria.

# October 19, 2008 10:23 PM

Leonardo ha opinado:

Ese Program.Close(); no funciona :S  

private void button1_Click(object sender, EventArgs e)

    {

      Program.Close();

    }

Salu2!!

# November 27, 2008 5:55 AM

Ricardo ha opinado:

Y la desventaja no seria que llamar de manera innumerada a muchos formularios hijos, uhmmmmmmmmmm :S

# November 27, 2008 6:04 AM

Marc Rubiño ha opinado:

Ricardo, leonardo:

Tener encuenta que esto es simplemente una solución propuesta a una duda del foro, no pretende ser la solución definitiva y si eligieramos utilizar esta opción, seguró que tendríamos que detallar mucho mejor su funcionamiento.

Para evitar no dejar colgada la aplicación no se , podríamos tener una lista de formularios instanciados y en el momento que solo quede uno cerrar por completo la aplicación.

Program.close() es un método estático creado por nosotros para cerrar la aplicación.

public static void Close()

{  

 Application.Exit();

}

Saludos.

# November 27, 2008 9:20 AM

Victor C. Soto ha opinado:

sera a esto que te refieres, es que no he entendido.

private void finalizarToolStripMenuItem_Click(object sender, EventArgs e)

       {

         Close() ;

       }

con esto cierro mi formulario principal.

# March 19, 2009 4:33 AM

Cecy ha opinado:

lo q nos muestran no funciona

# June 3, 2009 6:05 PM

DFRD ha opinado:

Bueno excelente man gran dato me funciono a la prefecion =)

# June 29, 2009 10:12 PM

Edgar Rodriguez ha opinado:

Excelente articulo. Me sirvio muchisimo :D

# July 2, 2009 5:18 AM

JOSE MANUEL GOMEZ ULIBARRI ha opinado:

HOLA, MAS QUE UN COMENTARIO TENGO UNA DUDA, MIRA MI APLICACION DE WINDOWS TIENE 7 PANTALAS Y CADA UNA TIENE UN BOTON DE SIGUIENTE PARA IR MOSTRANDO CADA PANTALLA COMO SE DEBE PERO YO LO QUE QUIERO ES QUE CUANDO HAGA CLIC EN CERRAR EN CUALQUIERA DE LAS PANTALLAS SE CIERRE LA APLICACION Y USO EL SIGUIENTE CODIGO.

private void M_ACC_2_FormClosed(object sender, FormClosedEventArgs e)

{

  DialogResult result;

  result = MessageBox.Show(this, "Si cierra esta pantalla se cerrará la aplicación. ¿Desea continuar?", "Mensaje de Sistema", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

           if (result == DialogResult.Yes)

           {

               Application.Exit();

           }

       }

PERO EL PROBLEMA ES QUE CUANDO EN EL MESSAGEBOX HAGO CLICK EN NO ME OCULTA EL FORMULARIO Y YA NO LO VEO PERO LA APLICACION SIGUE CORRIENDO ESPERO ME PUEDAN AYUDAR GRACIAS.

# March 12, 2010 8:39 PM

Juan manuel ha opinado:

tu codigo si funciona solo tienes que volver a mostrar tu formulario

private void M_ACC_2_FormClosed(object sender, FormClosedEventArgs e)

{

 DialogResult result;

 result = MessageBox.Show(this, "Si cierra esta pantalla se cerrará la aplicación. ¿Desea continuar?", "Mensaje de Sistema", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

          if (result == DialogResult.Yes)

          {

              Application.Exit();

                pantalla2.show();

          }

      }

# August 31, 2010 11:44 PM

Juan David Nicholls ha opinado:

mira, donde es que esta adjunto el ejemplo, me es de gran interes, saber como cierras el primer form1 y abres el otro...gracias

# March 7, 2011 6:23 AM

Alan ha opinado:

y que pasa si le das Alt+F4, se cerraran los formularios pero se quedara colgada la aplicacion como se soluciona esto?

# May 13, 2011 6:41 PM