2012-05-26 5 views
8

Es gibt zwei Formulare in meinem Projekt: Form1 und Form2. Es gibt eine Schaltfläche in Form1, und was ich tun möchte, ist das Schließen von Form1 und das Anzeigen von Form2 beim Klicken auf diese Schaltfläche.Wie verhindere ich, dass die App beim Schließen des Startformulars beendet wird?

Zuerst habe ich versucht,

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

aber als Form1 geschlossen wurde, Form2 wurde ebenfalls geschlossen. Als nächstes habe ich versucht,

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

aber es gibt einen Nachteil, dass die Anwendung nicht beendet, wenn das Form2 closed.So ist, ich in zusätzlichen Quellen in   form_FormClosing Abschnitt von Form2 zu setzen hatte.

Hmm .... Ich frage mich, ob dies der richtige Weg ist .... Also, was ist der richtige Weg, um dieses Problem zu behandeln?

Antwort

21

Die automatisch generierten Code in Program.cs geschrieben wurde, die Anwendung zu beenden, wenn das Startfenster geschlossen ist. Sie müssen es optimieren, damit es nur beendet wird, wenn keine Fenster mehr übrig sind. Wie folgt aus:

[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

können Sie auf diese Weise nehmen:

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

Hoffe, es war hilfreich.

+0

em .. das ist das gleiche wie das, was ich auf meine Frage schrieb. wie auch immer, danke für die Beantwortung – jn4kim

+0

Sie haben form1 und form 2, wenn Sie eine Taste auf form1 drücken, um form2 zu öffnen Sie form1 schließen möchten, wenn Sie form1.Hide() verwenden; es wird form1 verstecken, warum willst du form1 schließen? nur verstecken ist nicht gut für dich? – Shamal

2

Standardmäßig steuert das erste Formular die Lebensdauer einer Windows Forms-Anwendung. Wenn Sie mehrere unabhängige Windows-Formulare verwenden möchten, sollte Ihr Anwendungskontext ein separater Kontext von den Formularen sein.

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

Um den Kontext zu verwenden, übergeben Sie es an Application.Run (anstelle des Formulars). Wenn Sie eine andere Form1 erstellen möchten, rufen Sie MyContext.ShowForm1() usw.

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

schreiben, die in Ihre Methode, die ausgeführt wird, während FormClosing Ereignis 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 
     } 
} 
Verwandte Themen