In MSDN habe ich festgestellt CloseReason.UserClosing
, dass der Benutzer beschlossen hat, das Formular zu schließen, aber ich denke, dass dies sowohl für das Klicken auf die X-Schaltfläche als auch für das Klicken auf die Schaltfläche zum Schließen gleich ist. Wie kann ich diese beiden in meinem Code unterscheiden?
Vielen Dank an alle.
Antworten:
Angenommen, Sie fragen nach WinForms, können Sie das Ereignis FormClosing () verwenden . Das Ereignis FormClosing () wird jedes Mal ausgelöst, wenn ein Formular geschlossen werden soll.
Um festzustellen, ob der Benutzer entweder auf X oder auf Ihren CloseButton geklickt hat, können Sie ihn über das Absenderobjekt abrufen. Versuchen Sie, den Absender als Button-Steuerelement zu verwenden, und überprüfen Sie beispielsweise den Namen "CloseButton".
Andernfalls musste ich nie unterscheiden, ob auf X oder CloseButton geklickt wurde, da ich für das FormClosing-Ereignis etwas Bestimmtes ausführen wollte, z. B. das Schließen aller MdiChildren vor dem Schließen des MDIContainerForm oder das Überprüfen von Ereignissen auf nicht gespeicherte Änderungen. Unter diesen Umständen müssen wir meiner Meinung nach nicht von beiden Tasten unterscheiden.
Das Schließen mit ALT+ F4löst auch das Ereignis FormClosing () aus, da eine Nachricht an das Formular gesendet wird, die besagt, dass das Formular geschlossen werden soll. Sie können das Ereignis abbrechen, indem Sie die Einstellung
In unserem Beispiel würde dies übersetzt werden
Beachten Sie den Unterschied zwischen den Ereignissen FormClosing () und FormClosed () .
FormClosing tritt auf, wenn das Formular die zu schließende Nachricht empfangen hat und überprüft, ob es etwas zu tun hat, bevor es geschlossen wird.
FormClosed tritt auf, wenn das Formular tatsächlich geschlossen wird, also nachdem es geschlossen wurde.
Hilft das?
quelle
Die
CloseReason
Aufzählung, die Sie in MSDN gefunden haben, dient nur dazu zu überprüfen, ob der Benutzer die App geschlossen hat oder ob sie aufgrund eines Herunterfahrens oder durch den Task-Manager usw. geschlossen wurde.Sie können je nach Grund verschiedene Aktionen ausführen, z.
Aber wie Sie vermutet haben, gibt es keinen Unterschied zwischen dem Klicken auf die Schaltfläche x oder dem Klicken mit der rechten Maustaste auf die Taskleiste und dem Klicken auf "Schließen" oder Drücken von Alt F4usw. Alles endet in einem
CloseReason.UserClosing
Grund.quelle
Die "X" -Taste wird registriert,
DialogResult.Cancel
sodass eine weitere Option darin besteht, das auszuwertenDialogResult
.Wenn Sie mehrere Schaltflächen in Ihrem Formular haben, ordnen Sie wahrscheinlich bereits unterschiedliche Schaltflächen zu,
DialogResult
und dies gibt Ihnen die Möglichkeit, den Unterschied zwischen den einzelnen Schaltflächen zu erkennen.(Beispiel :
btnSubmit.DialogResult = DialogResult.OK
,btnClose.DialogResult = Dialogresult.Abort
)quelle
DialogResult
bleibtNone
. Was könnte das Problem sein?X
MarkenDialogResult
enthaltenCancel
, nichtNone
. Das ZuweisenNone
zu Ihrer Schaltfläche entspricht dem Festlegen der.DialogResult
Eigenschaft, und wenn Sieform.Close()
von der Ereignisbehandlungsroutine Ihrer Schaltfläche aus aufrufen ,form.DialogResult
wird diese enthaltenCancel
. Wenn Sie nur einen anderen Wert alsNone
oderCancel
allen Schaltflächen zum Schließen von Formularen zuweisen , können Sie die gewünschte Unterscheidung treffen.Wie kann man feststellen, ob das Formular geschlossen wurde, indem man auf die Schaltfläche X klickt oder
Close()
Code aufruft ?Sie können sich nicht auf den Grund für das Schließen von Formularargumenten verlassen, denn wenn der Benutzer auf die Schaltfläche X in der Titelleiste klickt oder das Formular mit Alt + F4 schließt oder das Systemmenü zum Schließen des Formulars verwendet oder das Formular durch Aufrufen der
Close()
Methode geschlossen wird, werden alle In den oben genannten Fällen wird der nahe Grund vom Benutzer geschlossen, was nicht das gewünschte Ergebnis ist.Um zu unterscheiden, ob das Formular durch die X-Schaltfläche oder nach der
Close
Methode geschlossen wurde, können Sie eine der folgenden Optionen verwenden:WM_SYSCOMMAND
und überprüfen SieSC_CLOSE
eine Flagge und setzen Sie sie.StackTrace
, ob einer der Frames einenClose
Methodenaufruf enthält .Beispiel 1 - Griff
WM_SYSCOMMAND
Beispiel 2 - Überprüfen von StackTrace
quelle
Es bestimmt, wann die Anwendung geschlossen werden soll, wenn ein Formular geschlossen wird (wenn Ihre Anwendung nicht an ein bestimmtes Formular angehängt ist).
quelle
Ich verwende in meinen Anwendungen immer eine Formularschlussmethode, die alt + x von meinem Exit-Button abfängt , alt + f4 oder ein anderes Formularschlussereignis wurde initiiert. In allen meinen Klassen ist der Klassenname
mstrClsTitle = "grmRexcel"
in diesem Fall als private Zeichenfolge definiert , eine Exit-Methode, die die Formularschließmethode aufruft, und eine Formularschließmethode. Ich habe auch eine Erklärung für die Form Closing Method -this.FormClosing = My Form Closing Form Closing method name
.Der Code dafür:
quelle
Sie können versuchen, einen Ereignishandler aus dem Entwurf wie folgt hinzuzufügen: Öffnen Sie das Formular in der Entwurfsansicht, öffnen Sie das Eigenschaftenfenster oder drücken Sie F4, klicken Sie auf die Schaltfläche in der Ereignissymbolleiste, um Ereignisse im Formularobjekt anzuzeigen, suchen Sie das FormClosing-Ereignis in der Gruppe Verhalten und doppelklicken Sie darauf. Referenz: https://social.msdn.microsoft.com/Forums/vstudio/en-US/9bdee708-db4b-4e46-a99c-99726fa25cfb/how-do-i-add-formclosing-event?forum=csharpgeneral
quelle
Wenn die Bedingung ausgeführt wird, wenn der Benutzer auf 'X' klickt oder die Schaltfläche im Formular schließt. Das else kann verwendet werden, wenn der Benutzer für einen anderen Zweck auf Alt + f4 klickt
quelle
quelle
Ich stimme der
DialogResult
Lösung als der direkteren zu.In VB.NET ist jedoch eine
CloseReason
Typumwandlung erforderlich, um die Eigenschaft -Property abzurufenquelle
Ich musste auch die Schließfunktion in der Methode "InitializeComponent ()" des Formulars registrieren:
Meine "FormClosing" -Funktion ähnelt der angegebenen Antwort ( https://stackoverflow.com/a/2683846/3323790 ):
Noch etwas zu erwähnen: Es gibt auch eine "FormClosed" -Funktion, die nach "FormClosing" auftritt. Um diese Funktion zu verwenden, registrieren Sie sie wie folgt:
quelle