¿Cómo evito que la aplicación finalice cuando cierro el formulario de inicio?

Hay dos Formas en mi proyecto: Form1 y Form2. Hay un botón en Form1, y lo que quiero hacer es cerrar Form1 y mostrar Form2 cuando se haga clic en ese botón.

Primero, lo intenté

Form2 frm = new Form2(); frm.Show(); this.Close(); 

pero como Form1 se cerró, Form2 también se cerró. Luego, lo intenté

 Form2 frm = new Form2(); frm.Show(); this.Hide(); 

pero existe la desventaja de que la aplicación no se cierra cuando se cierra el Form2. Por lo tanto, tuve que agregar fonts adicionales en la sección form_FormClosing de Form2.

Hmm … Me pregunto si este es el camino correcto … Entonces, ¿cuál es la forma correcta de manejar este problema?

El código generado automáticamente en Program.cs se escribió para finalizar la aplicación cuando se cierra la ventana de inicio. Tendrá que modificarlo para que solo finalice cuando ya no queden más ventanas. Me gusta esto:

  [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); var main = new Form1(); main.FormClosed += new FormClosedEventHandler(FormClosed); main.Show(); Application.Run(); } static void FormClosed(object sender, FormClosedEventArgs e) { ((Form)sender).FormClosed -= FormClosed; if (Application.OpenForms.Count == 0) Application.ExitThread(); else Application.OpenForms[0].FormClosed += FormClosed; } 

De forma predeterminada, el primer formulario controla la vida útil de una aplicación de Windows Forms. Si desea varios formularios de Windows independientes, su contexto de aplicación debe ser un contexto separado de los formularios.

 public class MyContext : ApplicationContext { private List
forms; private static MyContext context = new MyContext(); private MyContext() { forms = new List
(); ShowForm1(); } public static void ShowForm1() { Form form1 = new Form1(); context.AddForm(form1); form1.Show(); } private void AddForm(Form f) { f.Closed += FormClosed; forms.Add(f); } private void FormClosed(object sender, EventArgs e) { Form f = sender as Form; if (form != null) forms.Remove(f); if (forms.Count == 0) Application.Exit(); } }

Para usar el contexto, páselo a Application.Run (en lugar de a la forma). Si desea crear otro Form1, llame a MyContext.ShowForm1 () etc.

 public class Program { public void Main() { Application.Run(new MyContext()); } } 

Puedes tomarlo de esta manera:

 form2 f2=new form2() this.Hide(); f2.Show(); 

Espero que haya sido útil.

Escriba eso en su método que se ejecuta mientras FormClosing evento FormClosing .

 private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e) { // Display a MsgBox asking the user if he is sure to close if(MessageBox.Show("Are you sure you want to close?", "My Application", MessageBoxButtons.YesNo) == DialogResult.Yes) { // Cancel the Closing event from closing the form. e.Cancel = false; // e.Cancel = true would close the window } }