2012-05-26 19 views
8

Nel mio progetto sono presenti due moduli: Form1 e Form2. C'è un pulsante in Form1 e quello che voglio fare è chiudere Form1 e mostrare Form2 quando si fa clic su quel pulsante.Come posso evitare che l'app si chiuda quando chiudo il modulo di avvio?

In primo luogo, ho cercato

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

ma come Form1 era chiusa, Form2 anche ottenuto chiuso. Successivamente, ho cercato

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

ma v'è uno svantaggio che l'applicazione non uscire quando Form2 è closed.So, ho dovuto mettere in ulteriori fonti in   sezione form_FormClosing di Form2.

Hmm .... Mi chiedo se questo è il modo giusto .... Quindi, qual è il modo corretto di gestire questo problema?

risposta

21

Il codice generato automaticamente in Program.cs è stato scritto per terminare l'applicazione quando la finestra di avvio è chiuso. Dovrai modificarlo in modo che termini solo quando non ci sono più finestre. Come questo:

[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

Si può prendere in questo modo:

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

Speranza è stato utile.

+0

em .. questo è lo stesso di quello che ho scritto sulla mia domanda. comunque, grazie per aver risposto a – jn4kim

+0

hai form1 e modulo 2, quando premi un pulsante su form1 per aprire form2 vuoi chiudere form1, se usi form1.Hide(); nasconde form1, perché vuoi chiudere form1? solo nascondersi non fa bene a te? – Shamal

2

Per impostazione predefinita, il primo modulo controlla la durata di un'applicazione Windows Form. Se si desiderano più finestre indipendenti, il contesto dell'applicazione dovrebbe essere un contesto separato dai moduli.

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(); 
    }   
} 

Per utilizzare il contesto, passarlo a Application.Run (anziché al modulo). Se si desidera creare un altro Form1, chiamare MyContext.ShowForm1() ecc

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

scrivono che nel vostro metodo che viene eseguito mentre 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 
     } 
} 
Problemi correlati