¿Cómo puedo cerrar un formulario de inicio de sesión y mostrar el formulario principal sin que se cierre mi aplicación?

Tengo dos formas en mi proyecto (Inicio de sesión y Principal).

Lo que trato de explicar es que, si el inicio de sesión es exitoso, debo mostrar el formulario principal y cerrar el formulario de inicio de sesión.

Tengo este método en el formulario de inicio de sesión que cierra el formulario de inicio de sesión cuando el inicio de sesión es exitoso. Pero la forma principal no se muestra.

public void ShowMain() { if(auth()) // a method that returns true when the user exists. { var main = new Main(); main.Show(); this.Close(); } else { MessageBox.Show("Invalid login details."); } } 

Intenté ocultar el formulario de inicio de sesión si el proceso de inicio de sesión fue exitoso. Pero me molesta porque sé que mientras mi progtwig se está ejecutando, el formulario de inicio de sesión todavía está allí, debería estar cerrado, ¿verdad?

¿Cuál debería ser el enfoque correcto para esto? Gracias…

El motivo por el que no se muestra su formulario principal es porque una vez que cierra el formulario de inicio de sesión, la bomba de mensajes de su aplicación se apaga, lo que hace que la aplicación completa salga. El bucle de mensajes de Windows está vinculado al formulario de inicio de sesión porque es el que ha establecido como el formulario de inicio en las propiedades de su proyecto. Mire en su archivo “Program.cs” y verá el código de código responsable: Application.Run(new LoginForm()) . Consulte la documentación de ese método aquí en MSDN , que explica esto en mayor detalle.

La mejor solución es sacar el código de su formulario de inicio de sesión al archivo “Program.cs”. Cuando el progtwig empiece por primera vez, creará y mostrará el formulario de inicio de sesión como un diálogo modal (que se ejecuta en un bucle de mensajes por separado y bloquea la ejecución del rest del código hasta que se cierre). Cuando se cierre el cuadro de diálogo de inicio de sesión, verificará su propiedad DialogResult para ver si el inicio de sesión fue exitoso. Si lo fue, puede iniciar el formulario principal utilizando Application.Run (creando así el bucle de mensaje principal); de lo contrario, puede salir de la aplicación sin mostrar ningún formulario. Algo como esto:

 static void Main() { LoginForm fLogin = new LoginForm(); if (fLogin.ShowDialog() == DialogResult.OK) { Application.Run(new MainForm()); } else { Application.Exit(); } } 

Yo haría esto al revés.

En el evento OnLoad para su formulario principal, muestre el formulario de inicio de sesión como un diálogo. Si el resultado del cuadro de diálogo es correcto, permita que Main continúe cargando, si el resultado es una falla de autenticación, interrumpa la carga y muestre el cuadro de mensaje.

EDITAR muestra (s) de código

 private void MainForm_Load(object sender, EventArgs e) { this.Hide(); LogonForm logon = new LogonForm(); if (logon.ShowDialog() != DialogResult.OK) { //Handle authentication failures as necessary, for example: Application.Exit(); } else { this.Show(); } } 

Otra solución sería mostrar LogonForm desde el método Main en program.cs, algo como esto:

 static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); LogonForm logon = new LogonForm(); Application.Run(logon); if (logon.LogonSuccessful) { Application.Run(new MainForm()); } } 

En este ejemplo, LogonForm tendría que exponer una propiedad bool LogonSuccessful que se establece en true cuando el usuario ha ingresado credenciales válidas

Es sencillo.

Aquí está el código.

  private void button1_Click(object sender, EventArgs e) { //creating instance of main form MainForm mainForm = new MainForm(); // creating event handler to catch the main form closed event // this will fire when mainForm closed mainForm.FormClosed += new FormClosedEventHandler(mainForm_FormClosed); //showing the main form mainForm.Show(); //hiding the current form this.Hide(); } // this is the method block executes when main form is closed void mainForm_FormClosed(object sender, FormClosedEventArgs e) { // here you can do anything // we will close the application Application.Exit(); } 

Esta es la solución más elegante.

 private void buttonLogin_Click(object sender, EventArgs e) { MainForm mainForm = new MainForm(); this.Hide(); mainForm.ShowDialog(); this.Close(); } 

😉

Aquí hay una solución simple, ¿su problema es que su aplicación completa se cierra cuando su formulario de inicio de sesión se cierra correctamente? Si es así, vaya a las propiedades de su proyecto y en la pestaña de la aplicación cambie el modo de apagado a “Cuando se cierra el último formulario” de esa manera puede usar Me.close sin cerrar todo el progtwig

 static class Program { [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Login(); } private static bool logOut; private static void Login() { LoginForm login = new LoginForm(); MainForm main = new MainForm(); main.FormClosed += new FormClosedEventHandler(main_FormClosed); if (login.ShowDialog(main) == DialogResult.OK) { Application.Run(main); if (logOut) Login(); } else Application.Exit(); } static void main_FormClosed(object sender, FormClosedEventArgs e) { logOut= (sender as MainForm).logOut; } } public partial class MainForm : Form { private void btnLogout_ItemClick(object sender, ItemClickEventArgs e) { //timer1.Stop(); this.logOut= true; this.Close(); } } 

Esta es mi solución. Cree ApplicationContext para establecer la forma principal de la aplicación y cambie la forma principal cuando desee abrir un nuevo formulario y cerrar el formulario actual.

Program.cs

 static class Program { static ApplicationContext MainContext = new ApplicationContext(); ///  /// The main entry point for the application. ///  [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); MainContext.MainForm = new Authenticate(); Application.Run(MainContext); } public static void SetMainForm(Form MainForm) { MainContext.MainForm = MainForm; } public static void ShowMainForm() { MainContext.MainForm.Show(); } } 

Cuando el proceso de inicio de sesión se completa.

 private void BtLogin_Click(object sender, EventArgs e) { //Login Process Here. Program.SetMainForm(new Portal()); Program.ShowMainForm(); this.Close(); } 

Espero que esto ayude.

Creo que un método mucho mejor es hacer esto en el archivo Program.cs donde generalmente tiene Application.Run (form1), de esta manera obtienes un enfoque más limpio, el formulario de inicio de sesión no necesita estar acoplado a la forma principal, simplemente muestre el inicio de sesión y si devuelve verdadero, mostrará el formulario principal o el error.

Prueba esto:

 public void ShowMain() { if(auth()) // a method that returns true when the user exists. { this.Close(); System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(Main)); t.Start(); } else { MessageBox.Show("Invalid login details."); } } [STAThread] public void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Main()); } 

Debe llamar al nuevo formulario en un apartamento de thread diferente, si no estoy equivocado, debido al sistema de llamadas de las interfaces API y COM de Windows.

Un consejo: este sistema es altamente inseguro, porque puede cambiar la condición if (en MSIL) y es un “juego para niños” para transmitir su seguridad. Necesita un sistema más sólido para proteger su software, como ofuscación o acceso remoto o algo así.

Espero que esto ayude.

deberías hacerlo al revés:

Cargue primero la forma principal y en su evento de loginform muestre su forma de loginform con showdialog() que evitará que la forma mainform muestre hasta que loginform un resultado del loginform

EDITAR : como se trata de un formulario de inicio de sesión y si no necesita ninguna variable de su mainform ( que es un diseño incorrecto en la práctica ), realmente debe implementarlo en su program.cs como Davide y Cody sugirieron.

 public void ShowMain() { if(auth()) // a method that returns true when the user exists. { this.Hide(); var main = new Main(); main.Show(); } else { MessageBox.Show("Invalid login details."); } } 

La mejor forma para iniciar sesión y cerrar el formulario de inicio de sesión antes de iniciar sesión correctamente, ponga el formulario de inicio de sesión en FrmMain después de InitializeComponent.

  public FrmMain() { FrmSplash FrmSplash = new FrmSplash(); FrmSplash.ShowDialog(); InitializeComponent(); //Login Section { 

La publicación de Evan es demasiado antigua. Me gustaría darte un truco para hacer esto si quieres mostrar la pantalla de bienvenida / inicio de sesión y cuando la barra de progreso de la pantalla de inicio obtiene cierto valor / o se inicia sesión correctamente y cierras el splash / login y luego vuelves a mostrar la forma principal, frm-main será la forma de inicio no frm-spalash

en frm-main

 public partial class frmMain : Form { public frmMain() { frmSplash frm = new frmSplash(); frm.Show(); // new splash screen will shows this.Opacity=0; // will hide your main form InitializeComponent(); } } 

en el frm-Splash

 private void timer1_Tick(object sender, EventArgs e) { int cnt = progressBar1.Value; switch (cnt) { case 0: //Do sum stuff break; case 100: this.Close(); //close the frm-splash frmMain.ActiveForm.Opacity = 100; // show the frm-main break; } progressBar1.Value = progressBar1.Value+1; } 

si lo usa para el formulario de inicio de sesión

 private void btlogin_Click(object sender, EventArgs e) { bool login = false; //try your login here //connect your database or whatever //and then when it success update login variable as true if(login == true){ this.Close(); //close the frm-login frmMain.ActiveForm.Opacity = 100; // show the frm-main }else{ //inform user about failed login } } 

Tenga en cuenta que utilizo un temporizador y una barra de progreso para manipular las acciones que no necesita, solo para obtener una respuesta completa, espero que esto ayude.

prueba esto

  private void cmdLogin_Click(object sender, EventArgs e) { if (txtUserName.Text == "admin" || txtPassword.Text == "1") { FrmMDI mdi = new FrmMDI(); mdi.Show(); this.Hide(); } else { MessageBox.Show("Incorrect Credentials", "Library Management System", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } } 

y cuando salga de la aplicación puede usar

  Application.Exit();