2016-04-25 5 views
4

Ich habe zwei Formen, Haupt- und zweite Form. Da ich leicht zwischen ihnen navigieren möchten, während mehrere Instanzen jeder Vermeidung erstellen, benutzte ich diese bei Hauptform:Anwendung bleiben offen, wenn Owner.Show() für Hauptformular

Form2 secondForm = new Form2(); 
private void btnForm2_Click(object sender, EventArgs e) 
{ 
secondForm.Show(this); 
Hide(); 
} 

und dem folgenden Code bei zweite Form:

private void Form2_FormClosing(object sender, FormClosingEventArgs e) 
{ 
e.cancel = true; 
Owner.Show(); 
Hide(); 
} 

Alles funktioniert einfach perfekt, außer dass ich die Anwendung nicht schließen kann. Wenn ich in die zweite Form und zurück zum Haupt gehe, funktioniert der Schließen-Button überhaupt nicht.

Wie kann ich das Programm schließen, während ich diesen Code noch benutze?

Ich habe auch versucht, diesen Code zu sehen, ob Schließen-Schaltfläche selbst arbeitet:

private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
{ 
     MessageBox.Show("Closing"); 
} 

MessageBox gezeigt wurde, aber nichts geschah nach.

Antwort

0

Dies geschieht, weil das zweite Formular nicht geschlossen ist - Sie e.Cancel verwenden = true auf es. Fügen Sie die folowing Linie, wenn Sie Schließung aller Anwendungsfenster zwingen wollen

private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    System.Windows.Forms.Application.Exit(); 
} 

dann in form2, können Sie überprüfen, ob der Nähe von Benutzer oder aus Anwendung gerichtet ist:

void Form2_FormClosing(object sender, FormClosingEventArgs e) 
{ 
//close button click by user on form 2 
    if(e.CloseReason == CloseReason.UserClosing) 
     e.cancel = true //cancel event 
    else 
    e.cancel = false //close this form 
} 

Oder Sie können CloseReason verwenden .UserClosing, um Ihre Stornierung abhängig von der Elternschaft zu richten. Zum Beispiel:

void Form2_FormClosing(object sender, FormClosingEventArgs e) 
    { 

//check if closing signal is from parent 
     if (e.CloseReason == CloseReason.UserClosing.FormOwnerClosing) 
     e.cancel = false //close this form 
     else 
      e.cancel = true 
    } 
+0

Dieser funktioniert genau wie Drücken der Schließen-Taste und wird nicht funktionieren. – farshad

+1

Sie sind rechts Farshad, die Enviroment.Exit (0) erzwingen die Schließung. Ich werde meine Antwort korrigieren –

3

Verwenden

Environment.Exit(0); 

+0

Sieht aus wie 'Application.ExitTread();' funktioniert auch. Aber sind diese sicheren Weg, um das Programm zu schließen? – farshad

+0

yes 'Environment.Exit (0);' ist die Methode zum Schließen der Anwendung, 'this.Close()' schließt nur diese Instanz, aber 'Environment.Exit (0);' schließt die gesamte Anwendung – Mostafiz

+1

'Application.ExitTread();' ist nicht die richtige Art und Weise denke ich – Mostafiz

0

Schließen Form1 'versucht' zu schließen form2 zu schließen. Führt das Form2_Closing-Ereignis aus, das das Schließen und Ausführen von form1 abbricht.

Code mit unsubsibing zu Ereignissen (schnell & dreckig), beachten Sie den internen Modifikator auf Form2. Sie könnten in Betracht ziehen, die Subskriptionen stop/start als Methoden zu verwenden.

private void btnForm2_Click(object sender, EventArgs e) 
    { 

     secondForm.FormClosing += secondForm.Form2_FormClosing; 
     secondForm.Show(this); 
     Hide(); 
    } 

    internal void Form2_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     e.Cancel = true; 



     FormClosing -= Form2_FormClosing; 
     Owner.Show(); 
     Hide(); 
    } 

Danach Posting Ich erkannte Sie die FormClosingEventArgs.CloseReason Eigenschaft für eine einfachere Lösung verwenden:

private void Form2_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     if (e.CloseReason == CloseReason.FormOwnerClosing) { return; } 
     e.Cancel = true; 
     Owner.Show(); 
     Hide(); 


    } 
+0

Gibt es sowieso Form2_Closing-Ereignis im Form1_Closing-Ereignis zu ändern? – farshad

+1

Sie können das Ereignis subskribieren, wenn es bei dem Ereignis, bei dem Form2 geschlossen ist, angezeigt und nicht subskribiert wird. – user6144226

+0

Es sieht wie die Antwort aus, die ich suche, können Sie bitte ein Beispiel des Codes schreiben? – farshad

0

Ich bevorzuge einfache Lösungen.

In Form1_FormClosing Verwendung:

secondForm.Close(); 

Und hier ist die Pointe. In Form2_FormClosing den Code wickeln Sie bereits haben:

if (this.Visible) 
{ 
    ... 
} 

Und das funktioniert für mich. Wenn ich das Hauptformular schließe, wird es geschlossen, da das Form2 nicht sichtbar ist und den Abschluss nicht abbrechen kann.

Seit der Antwort, die Environment.Exit (0) angibt; wurde upvoted, siehe winforms - How to properly exit a C# application? - Stack Overflow. Es zitiert das MSDN, das es für Konsolenanwendungen sagt. Ich sehe das nicht in der aktuellen Dokumentation, aber es scheint immer noch relevant zu sein. Siehe auch Application.Exit() vs Application.ExitThread() vs Environment.Exit(). Die Übereinstimmung scheint die von Environment.Exit, Application.ExitTread und Application.Exit zu sein, Application.Exit scheint die beste zu sein. Ich würde jedoch keine von ihnen verwenden, außer um meine Anwendung abnormal zu beenden, z. B. in einem Fehler.

+0

Leute sollten Downvotes erklären. Meine einzige Erklärung für die Downvotes ist, dass es erklärt, dass Environment.Exit (0) für Konsolenanwendungen ist. Wenn das Problem der Verweis auf die andere Antwort ist, dann kann ich den Teil "Seit der Antwort, der spezifiziert" entfernen; erklären, dass das besser wäre als anonymes Downvoting. – user34660

+0

Ich verstehe auch nicht die Down-Stimmen. Ich war auch besorgt über "Invironment.Exit (0)", es funktioniert, aber es ist nicht der normale Weg, um die Anwendung zu schließen. – farshad

+0

Bevorzugen Sie immer noch die Antwort, die CloseReason.UserClosing verwendet? Ich verstehe das Problem damit nicht. – user34660

Verwandte Themen