2011-01-06 7 views
0

Ich habe einen Event-Handler, der das FormClosing-Ereignis abonniert hat. Dieser Event-Handler bietet einen Dialog für den Benutzer, wenn er meine Anwendung beendet. wie folgt:Wie haben Sie zwei Versionen eines Event-Handlers?

private void frmUavController_FormClosing(object sender, System.ComponentModel.CancelEventArgs e) 
    { 
     DialogResult dlgResult = MessageBox.Show("Are you sure you want to exit?", "Exit?", 
      MessageBoxButtons.YesNo, MessageBoxIcon.Question); 

     if (dlgResult == DialogResult.Yes) 
     {     
      UtilSTKScenario.PauseScenarioAnimation(UtilSTKScenario._stkObjectRoot);     
     } 
     else if (dlgResult == DialogResult.No) 
     { 
      e.Cancel = true; 
     } 
    } 

Da die Anwendung nebeneinander ausgeführt wird; COM-Befehle in eine andere Anwendung einfügen - Ich möchte, dass meine Anwendung beendet wird, wenn die Anwendung, die COM-Befehle empfängt, nicht gestartet wird (oder während der Ausführung geschlossen wird). Dies wird folgendermaßen erreicht:

static UtilSTKScenario() 
    { 
     // give time for active form to show 
     Thread.Sleep(100); 

     _stkProgramId = ConfigurationManager.AppSettings.Get("stkProgramId"); 

     if (CheckIfStkIsLaunched()) 
     { 
      InitAllFields(); 
     } 
     else 
     { 
      HideController dHideController = new HideController(((frmUavController)Form.ActiveForm).HideControllerUi); 
      ((frmUavController)Form.ActiveForm).Invoke(dHideController); 
      Application.Exit(); 
     } 
    } 

Der Aufruf von 'Application.Exit()' bewirkt, dass das FormClosing-Ereignis ausgelöst wird. Das will ich nicht - ich möchte, dass die Anwendung einfach beendet wird.

Irgendwelche Ideen?

WulfgarPro

Antwort

3

Möglicherweise können Sie die Ereignisargumente des FormClosing-Ereignisses anzeigen. FormClosingEventArgs hat eine CloseReason Eigenschaft, die einen Indikator geben kann, wenn das Formular von einem Benutzer direkt im Gegensatz zu einem anderen Mechanismus geschlossen wurde.

Obwohl ich nicht klar bin, wie Application.Exit() Aufrufe erscheinen ... Wenn es auch als CloseReason.UserClosing zeigt, dann müssen Sie möglicherweise eine Überladung zu Ihrem Formular [z. SystemClose()], um das Formular zu schließen und eine Instanzvariable zu verwenden, um zu signalisieren, dass es in Ihrem Handler nicht angefordert wird.

0

Können Sie das Senderobjekt betrachten? Meine Vermutung ist, dass das Absenderobjekt unterschiedlich ist, abhängig davon, dass Sie das Formular tatsächlich schließen oder die Methode Application.Exit() aufrufen.

+0

meine aktuelle Lösung ist die Verwendung einer Flagging-Variable. Ich werde jetzt den Absender anschauen. Vielen Dank! – wulfgarpro

+0

Sender ist immer das aktive Formularobjekt; in diesem Fall - frmUavController. – wulfgarpro

1

Der typische Weg, um mit dieser Art von Sache zu umgehen (Bypass normale "Möchten Sie schließen?" Prüfungen) ist eine boolesche Variable zu verwenden. Benennen Sie es etwa wie _forceExit, setzen Sie es auf "true", wenn das externe Ereignis Sie zum Schließen zwingt, und wenn es wahr ist, überspringen Sie das Dialogfeld in Ihrem Closing-Ereignis.

+0

+1, das ist der eine. –

+0

das funktionierte für mich, aber deine andere Antwort fand ich eleganter. – wulfgarpro

2

Ihr FormClosing-Ereignis ruft einen FormClosingEventArgs-Parameter ab, der über eine CloseReason-Eigenschaft verfügt. Wenn das CloseReason.ApplicationExitCall ist, wird das Formular aufgrund eines Aufrufs von Application.Exit geschlossen. Sie können Ihre "Schließen" einfach überspringen. Aufforderung in diesem Fall.

private void frmUavController_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    if (e.CloseReason == CloseReason.ApplicationExitCall) 
     return; 
    // ... 
+0

Ich kann nicht scheinen, diese 'CloseReason' Eigenschaft zu finden. Das e ist vom Typ CancelEventArgs nicht FormClosingEventArgs? – wulfgarpro

+0

FormClosingEventArgs ist eine Unterklasse von CancelEventArgs. Ich habe sie einfach getauscht und es funktioniert super. Sie müssen den Typ von "e" in Ihrem Code oben ändern. – wulfgarpro

+0

Sie haben Recht - ich habe es falsch kopiert. Fest. –

Verwandte Themen