none
cerrar form principal sin cerrar la aplicacion en C# RRS feed

  • Pregunta

  • Hola... he buscado como hacer para cerrar el form principal sin cerrar aplicacion...

    lo que he encontrado es..

     

    form2 nuevo = new form2();
    
    //para cerrarlo pongo lo siguiente
    
    form1.Close();
    

     

     

    pero eso me cierra la aplicacion.. 

    y si pongo 

    Form1.Hide();
    

    solo me la oculta, no la cierra...

    quisiera saber si hay una forma o si tienen un ejemplo..se los agradeceria mucho

     

    Saludos!!

    domingo, 26 de junio de 2011 17:04

Respuestas

  • Ok, veo que esta pregunta se ha vuelto popular durante el tiempo y todas las respuestas marcardas como respuestas son incorrectas (y las que no también).

    El esténcil (o machote o template, como quieran llamarle) de Windows Forms crea un punto de entrada estándar llamado Main en el archivo Program.cs con una versión de Application.Run() que automáticamente termina de ejecutar el programa en cuanto el formulario que se le indicó se cierra.  Hay otras variantes de Application.Run() que pueden usarse para alterar este comportamiento.

    Por ejemplo:

    Application.Run() sin argumentos inicia el bucle de mensajes pero no depende del cierre de ningún formulario.  La única forma de finalizar el bucle de mensajes es llamando a Application.Exit().

    Luego está el Application.Run(appContext) que recibe un objeto que controla exactamente cuándo debe terminarse el bucle de mensajes.  El enlace de MSDN provee un ejemplo detallado de uso.

    Y por supuesto, está lo más fácil de todo:  Agregar código después de Application.Run(new Form1()).


    Jose R. MCP
    Code Samples

    viernes, 6 de abril de 2018 19:43
    Moderador

Todas las respuestas

  • hola

    el tema es que el formulario que defines en el Applciation.Run() que esta en Main del archivo Programs.cs es el que defineel form principal

     

    lo que no ash comentado es porque quieres ocutar o cerrar ese formulario, cal es el objetico, buscas hacer un login o alguna tarea similar ?

    porque si es asi podorias justamente programar en el Main() para realizarlo

     

     Winforms, realizar tareas antes de inicializar aplicacion

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    domingo, 26 de junio de 2011 17:30
  • Si lo que quieres es cerrar el formulario principal si cerrar la aplicación, llamamos formulario prinpal a aquel que se ejecuta desde método main de la aplicación...Esto que pides es muy usado cuando necesitas hacer un Login como te comenta Leonardo...Tendrás que usar multihilo como recurso para poder hacer...acá te dejo un ejemplo simplificado donde en el formulario que se ejecuta desde el Main se pide un nombre y un password de cumplirse con lo esperado se abre un nuevo hilo, el cual ejecuta el método RunPrincipal y luego se cierra el forumlario inicial...

    Bueno espero haberte ayudado...

    Un saludo

    Abel

     

    private void IniciarSesion(String pass,nom){

        if (nom=="user1" && pass = "123")
        {
            NuevoHilo = new System.Threading.Thread(new System.Threading.ThreadStart(RunPrincipal)); 
            this.Close();
            NuevoHilo.SetApartmentState(System.Threading.ApartmentState.STA);
           NuevoHilo.Start();
        }

    }

     

    private void RunPrincipal()
    {
                frmPrincipal frm = new frmPrincipal();
                frm.ShowDialog();
    }


    Un Saludo Abel
    • Marcado como respuesta myle25 domingo, 26 de junio de 2011 22:14
    • Desmarcado como respuesta webJoseModerator viernes, 6 de abril de 2018 19:47
    domingo, 26 de junio de 2011 17:48
  • EXCELENTE SOLUCION, YO TBN TENIA EL MISMO PROBLEMA CON EL LOGIN Y EL CIERRE DE TODA LA APLICACION, AHORA FUNCIONA A LA PERFECCION.

    PERO AHORA ME PREGUNTO, PARA PASARLE LOS PARAMETROS DEL USUARIO LOGEADO AL FORMULARIO PRINCIPAL, PORQUE SE SUPONE QUE DEBE APARECER SU NOMBRES DEL USUARIO VALIDADO...THANKS.

    lunes, 27 de junio de 2011 4:31
  • hola

    pero para un login no necesitas abrir un nuevo hilo ni nada raro, has analziado la solucion del link que pase, veras que era mucho mas simple que trabjar con hilos

    o sino tambien esta este otro articulo

    Login – Usando Password con Hash

    revisa como se programa en el Main() que esta en Program.cs, veras que es muy facil implementar el login

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    lunes, 27 de junio de 2011 4:57
  • A ver para eso te cuento, podrías crearte una clase estática en el proyecto de acceso público en el cual defines un grupo de propiedades que inicializas en el momento del login, podría quedarte algo como esto....

    private void IniciarSesion(String pass,nom){

    if (nom=="user1" && pass = "123")
    {

    ClaseEstatica.usuario=nom;

    ClaseEstatica.orndenador = orndenador_donde_inicio_sesión;

    ClaseEstatica.propiedadesNencesarias = valorescargados de la base de datos (por ejemplo los permisos que ese usuario tendrá en la aplicación)


    NuevoHilo = new System.Threading.Thread(new System.Threading.ThreadStart(RunPrincipal));
    this.Close();
    NuevoHilo.SetApartmentState(System.Threading.ApartmentState.STA);
    NuevoHilo.Start();
    }

    }

     

    Y como es una clase estática y de acceso público desde el formulario principal tenrías acceso...

    Bueno espero me entiendas...

    Un saludo

    abel

     


    Un Saludo Abel
    lunes, 27 de junio de 2011 19:39
  • pero no entienedo porque thread y clase static para implementar un login

    si seria tan simple como usar el metodo Main y pasar el id del usuario al form principal

     

    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
           
            frmLogin frm = new frmLogin();
            frm.ShowDialog();

            if(frm.DialogResult == DialogResult.OK)
                Application.Run(new frmPrincipal());

        }
    }

     

    esas dos linea haces el loginsin hilos y para apsar la info solo se deberia poner una propiedad para pasar al siguente form o sea a frmPrincipal

    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
          
            frmLogin frm = new frmLogin();
            frm.ShowDialog();

            if(frm.DialogResult == DialogResult.OK)
            {
                frmPrincipal _principal = new frmPrincipal();
                _principal.UserId = frm.UserId;
                Application.Run(_principal);
            }

        }
    }

     

    por supuesto el login deberias devolver el si del usaurio, pero se evita los problemas de los hilos y los bloqueos que este podrias causar

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    lunes, 27 de junio de 2011 19:58
  • Si lo único que necesitas es pasar el nombre del usuario pues claro que sería como propone Leonardo, pero sin embargo si quieres implementar una solución global para un proyecto grande donde necesitas por ejemplo: Validar si un usuario tiene permisos para ver o modificar determinado formularios, la solución de la clase estática accesible desde cualquier parte del proyecto y definida en un "proyecto base" sería en mi opinión una buena solución pues permite homogeneidad en la implementación de todos los formularios...Explico más...

    La idea es definir la clase estática en la cual definiré un grupo de propiedades entre las que se encuntra una tabla de permisos del usuario que hizo login y además le defino un método que me permitirá saber si el usuario en custión tiene permiso para visualizar el formulario que se inicia...

    Ponemos un código como el siguiente en un método inicializador de formularios que será el mismo para todos los formularios de la aplicación...

    this.Requerido = (int)Enumerados.Modulos.Gestion_Clientes;
    if (!WinUtil.TienePermiso(this.Requerido, (int)Enumerados.Acciones.Ver) || (WinUtil.TienePermiso(this.Name, Enumerados.Modulos.Gestion_Clientes.ToString(), (int)Enumerados.Acciones.No_Heredar) && WinUtil.TienePermiso(this.Name, Enumerados.Modulos.Gestion_Clientes.ToString(), (int)Enumerados.Acciones.Ver)))
    {
          this.MostrarExcepcion(new MExcepcion(Proyecto.Interfaces.Gestion.Resource.sinpermiso_ver, Enumerados.TipoExcepcion.Error));
           return false;
    }

     

    Como verán el método TienePermiso se definiría en esa clase estática accesible y por tanto la forma de validar los permisos de un usuario sería única para todos los formularios, ganando así en homogeneidad a la hora de desarrollar y además al cargar los permisos al inicio de la aplicación en una estructura de datos dentro de esa clase estática no necesito cada vez que abro un formulario consultar la BD. En fin es crearme una clase CacheUsuario...

    Bueno espero entiendan mis razones, solo respondí a través de la experiencia más reciente y como siempre receptivo a cualquier idea....

    Un saludo

    Abel


    Un Saludo Abel
    lunes, 27 de junio de 2011 20:42
  • la solución de la clase estática accesible desde cualquier parte del proyecto

    pero aplicar Singleton no seria una opcion mejor a los static

    en la clase singleton podrias obtener la misma instancia y seria accesible de forma global

    apunto esto porque mantendrias las ventajas de POO

     


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    lunes, 27 de junio de 2011 20:46
  • Es que estamos en sintonia, si que aplico Singleton en el la aplicación que estoy desarrollando...pensé que tenia escrito un post sobre como me monté todo esto y te iba a pedir tu opinión pero no aún no lo he hecho...que lástima pues me gustaría saber tu opinión de algunas cosas "estructurales" que me hecreado...si puedes dime que crees de estos post que no tienen relación directa con este análisis pero igual me gustaría tu opinión...Es de las primeras cosas que escribí en el mi reciente blog, y aún me cuesta explicarme de forma escrita...Te reitero q me gustaría tu opinión...

    Un saludo

    Abel

     

    http://sophinet.wordpress.com/2011/02/04/un-acercamiento-a-algunos-patrones-de-diseno/

     

    http://sophinet.wordpress.com/2011/02/05/un-validador-de-formularios-patron-observer/

     


    Un Saludo Abel
    lunes, 27 de junio de 2011 21:34
  • hola

    revise los articulos, lindos temas, la explicacion me gusto, pero encontre dos dificultades

    - la falta de identaciond el codigo

    - el tipo de letra y color del codigo es el mismo al del articulo

    si son detalles por ahi sin importancia pero a la hora de analziar un articulo cuanta una buena lectura del codigo

    recomendaria uses algo como

    http://precode.codeplex.com/

     

    otro punto que estaria bueno es si publicarias la solucion del codigo del articulo, a veces con publicar el codigo ayuda para que se tenga algo donde poder probar y ver como funciona

     

    esto puntos que marco los tengo muy en cuenta cuando armo articulos, se que no soy bueno escribiendo, pero un buen codigo y los ejemplos publicados simrpe ayudan

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    martes, 28 de junio de 2011 3:14
  • Para cerrar la aplicación puede utilizar el siguiente código:

    Application.Exit();

    lunes, 11 de noviembre de 2013 20:45
  • Hola que tal, hay muchas formas y métodos de hacer eso. Yo también pasé por lo mismo, pero lo que me srivió para solucionar mi problema fue esto:

    form2 nuevo = new form2();

    this.Hide();

    nuevo.ShowDialog();

    this.Close();



    miércoles, 16 de julio de 2014 17:41
  • Excelente!!!! me sirvió y es una manera muy simple
    lunes, 1 de junio de 2015 22:41
  • hay un codigo que le puede servir el codigo es:

    this.hide();

    este codigo cierra el formulario 

    martes, 30 de junio de 2015 2:17
  • No lo cierra, solo lo oculta... Hide (inglés) = esconder, ocultar en español
    martes, 4 de octubre de 2016 19:18
  • Apenas voy iniciando en programación, por lo que muchos códigos son enredosos para mí, pero viendo esto funciona a la perfección, y también es fácil de entender para alguien que apenas va iniciando.

    Excelente, muchas gracias!

    viernes, 6 de abril de 2018 18:14
  • Ok, veo que esta pregunta se ha vuelto popular durante el tiempo y todas las respuestas marcardas como respuestas son incorrectas (y las que no también).

    El esténcil (o machote o template, como quieran llamarle) de Windows Forms crea un punto de entrada estándar llamado Main en el archivo Program.cs con una versión de Application.Run() que automáticamente termina de ejecutar el programa en cuanto el formulario que se le indicó se cierra.  Hay otras variantes de Application.Run() que pueden usarse para alterar este comportamiento.

    Por ejemplo:

    Application.Run() sin argumentos inicia el bucle de mensajes pero no depende del cierre de ningún formulario.  La única forma de finalizar el bucle de mensajes es llamando a Application.Exit().

    Luego está el Application.Run(appContext) que recibe un objeto que controla exactamente cuándo debe terminarse el bucle de mensajes.  El enlace de MSDN provee un ejemplo detallado de uso.

    Y por supuesto, está lo más fácil de todo:  Agregar código después de Application.Run(new Form1()).


    Jose R. MCP
    Code Samples

    viernes, 6 de abril de 2018 19:43
    Moderador