2012-05-26 8 views
8

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.¿Cómo evito que la aplicación finalice cuando cierro el formulario de inicio?

En primer lugar, he intentado

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

pero como Form1 se cerró, Form2 también quedó cerrado. A continuación, intentó

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

pero hay una desventaja de que la aplicación no salir cuando el Form2 es closed.So, que tenía que poner en fuentes 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?

Respuesta

21

El código generado automáticamente en Program.cs fue escrito para terminar la aplicación cuando la ventana de inicio se cierra. Tendrá que modificarlo para que solo finalice cuando ya no queden más ventanas. De esta manera:

[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; 
    } 
0

Puede tomar este camino:

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

espero que haya sido útil.

+0

em .. esto es lo mismo que escribí sobre mi pregunta. de todas formas, gracias por responder – jn4kim

+0

tiene form1 y form 2, cuando presiona un botón en form1 para abrir form2 desea cerrar form1, si usa form1.Hide(); ocultará form1, ¿por qué quieres cerrar form1? simplemente ocultar no es bueno para ti? – Shamal

2

De forma predeterminada, el primer formulario controla la duración 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<Form> forms;  

    private static MyContext context = new MyContext(); 

    private MyContext() 
    { 
     forms = new List<Form>(); 
     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 del formulario). Si desea crear otra Form1, llame MyContext.ShowForm1(), etc.

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

escribir que en su método que se ejecuta mientras FormClosing evento occure.

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 
     } 
} 
Cuestiones relacionadas