Finalizar al cerrar el ultimo formulario C#


Hoy me encontré con algo que en una aplicación VB lo hubiese resuelto de una manera fácil, el detalle es que después de realizar el login en la ventana respectiva tenia que abrir un panel principal y cerrar la ventana de logueo, cuando utilizaba el método Close() después de hacer la validación correcta (Usuario y Password) la aplicación se cerraba por completo. En una aplicación VB la solución hubiese sido modificar el ShutdownMode a when last form closes (Ciérrese sólo cuando el último formulario se haya cerrado.) y listo solucionado.



Pues bien pensé encontrar esta misma opción en una aplicación C#, pero….Oh sorpresa!!! Nunca la encontré, una solución básica a este problema es trabajar con el método Hide() del formulario(mejor dicho ocultarlo) y abrir el siguiente Form, buscando información en la web me encontré con que tenia que modificar el archivo Program.cs.
Por defecto el archivo Program.cs muestra el siguiente código:

using System;
using System.Windows.Forms;

namespace EjemploCS
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}

Tenia que realizar algunas ligeras modificaciones.
Primero agregamos una referencia a Microsoft.VisualBasic

Luego remplazar el código de Program.cs por este otro.

using System.Windows.Forms;
using Microsoft.VisualBasic;

namespace EjemploCS
{
    public class MyApplication : Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase
    {
        public MyApplication()
            : base(Microsoft.VisualBasic.ApplicationServices.AuthenticationMode.Windows)
        {
            this.IsSingleInstance = false;
            this.EnableVisualStyles = true;

            //Aqui esta el truco
            this.ShutdownStyle = Microsoft.VisualBasic.ApplicationServices.
                ShutdownMode.AfterAllFormsClose;
        }

        protected override void OnCreateMainForm()
        {

            this.MainForm = new frmLogin();
        }

        internal static void Main(string[] Args)
        {
            string[] arg; arg = new string[0];
            new MyApplication().Run(arg);
        }
    }
}

(Pues creas la clase MyAplication que herede de Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.)

Agregue código al Button

        private void button1_Click(object sender, EventArgs e)
        {
            mdiPrincipal ofrm = new mdiPrincipal();
            ofrm.Show();
            Close();
        }

(Para seguir este ejemplo cree un nuevo proyecto en el lenguaje C#, este proyecto debería contar con 2 Formularios: frmLogin y mdiPrincipal)

frmLogin:

Anuncios

6 pensamientos en “Finalizar al cerrar el ultimo formulario C#

  1. Buena solucion prof… tenia una solucion parecida a la suya pero manejando las clases… pero definitivamente esta solucion es mas pequeña y sencilla…

      • bueno prof. mi solución es la siguiente..:

        La clase program.cs
        *************************************************************************************************
        using System;
        using System.Collections.Generic;
        using System.Windows.Forms;

        namespace EjemploForms
        {
        static class Program
        {
        [STAThread]
        static void Main()
        {
        Application.EnableVisualStyles();

        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new initial_form ()); // <- aqui el truquito,.direccionar a una clase
        }
        }
        }

        La clase initial_form.cs
        ******************************************************************************************************
        using System;
        using System.Collections.Generic;
        using System.Linq;
        using System.Text;
        using System.Windows.Forms;

        namespace EjemploForms
        {
        public class initial_form : System.Windows.Forms.ApplicationContext
        {
        public initial_form ()
        {
        try
        {
        FrmLogin frmLogin = new FrmLogin();
        frmLogin.Show();
        catch (Exception ex)
        {
        MessageBox.Show(ex.Message);
        }
        }

        }
        }

        **********************************************************************************
        el detalle es q tiene q controlar Ud. cual sera el ultimo formulario q cerrará.. y como puede ser o no una ventaja….

  2. Proff. para q no tenga problemas en un futuro con algunos controles agregue esta linea q se le ovido al parecer..
    public class Program : Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase
    {
    public Program()
    : base(Microsoft.VisualBasic.ApplicationServices.AuthenticationMode.Windows)
    {
    this.IsSingleInstance = false;
    this.EnableVisualStyles = true;
    //Aqui esta el truco
    this.ShutdownStyle = Microsoft.VisualBasic.ApplicationServices.
    ShutdownMode.AfterAllFormsClose;
    }
    protected override void OnCreateMainForm()
    {
    this.MainForm = new GUILogOn();
    }
    [STAThread] //<–(esta linea es por que algunos controles necesita el STAT)
    internal static void Main(string[] Args)
    {
    string[] arg; arg = new string[0];
    new Program().Run(arg);
    }
    }

  3. en una aplicacion MDI el truco en c# es usar this en cada formulario, por ejemplo en mi proyecto puse this.Close(); EN LUGAR DE close() Ycon esto se termina unicamente la System.Windows.Forms.Form que esta activa. Saludos.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s