Wie EventArgs Abbrechen Arbeit im FormClosing-Ereignis?
-
11-09-2019 - |
Frage
Wie funktioniert die e.Cancel event-arbeiten in der FormClosing-Ereignis auf einem WinForm?Ich weiß, Sie möchten, True
zum Abbrechen der Schließung, aber an welchem Punkt hört das Formular verarbeiten diese?Ist es eine sekundäre Handlung, die durch die Eigenschaft aus?
Wie könnte ich das umsetzen einer ähnlichen Aktion in einem benutzerdefinierten Steuerelement?(C# oder VB)
Hinweis: Ich habe mir für etwa 30 Minuten nun und konnte nicht finden alle Antworten, die Sie in Google oder SO suchen, wenn es ein Duplikat ist, meine schlechte.
Lösung
Ich denke, dass das ursprüngliche Plakat, Fragen sich vielleicht, was passiert, wenn einige Abonnenten set Cancel = false
und einige Abonnenten set Cancel = true
.Wenn dies der Fall ist, dann ist die Frage "Wann ist die form dieser Prozess" dauert mehr an Bedeutung.
Anfangs fragte ich mich, ob die setter eingeführt ODER oder, UND jede Wert.Verwendung Reflektor zur Prüfung der setter für CancelEventArgs.Cancel
zeigt es stellt einfach ein eigenes Feld:
public bool Cancel
{
get{ return this.cancel; }
set{ this.cancel = value; }
}
Also dachte ich, dass ein Blick in die ' - Form.OnClosing(CancelEventArgs args)' zeigen würde, wenn der Wert aktiviert ist, wie in den vorherigen Antworten, aber das ist nicht das, was Reflektor zeigt:
[EditorBrowsable(EditorBrowsableState.Advanced)]
protected virtual void OnClosing(CancelEventArgs e)
{
CancelEventHandler handler = (CancelEventHandler) base.Events[EVENT_CLOSING];
if (handler != null)
{
handler(this, e);
}
}
Also habe ich aktiviert-source-debugging und fand immer die EVENT_CLOSING
Delegierter des Events
Sammlung fällt tief hinab in die windowing-API, so dass handler
in der ersten Zeile des OnClosing
ist null
wenn die form setzt Cancel = true
, was bedeutet, das von verwaltetem code nie wirklich testet, ob CancelEventArgs.Cancel == true
.Wenn Sie möchten, dass der hässliche Eingeweide dessen, was im EventHandlerList, erhalten Sie dies:
get {
ListEntry e = null;
if (parent == null || parent.CanRaiseEventsInternal)
{
e = Find(key);
}
if (e != null) {
return e.handler;
}
else {
return null;
}
}
Beim Debuggen parent.CanRaiseEventsInternal
ist false, wenn die Schließung wurde abgesagt.
So ...die tatsächliche Umsetzung der Abbruch der Schließung der form ist komplizierter als die vorherigen Antworten, aber Ihre Vorschläge, wie stornieren Sie Ihre eigenen Ereignisse richtig zeigen, wie es in verwalteten code.Rufen Sie die CancelEventHandler und testen Sie dann den Wert von CancelEventArgs.Cancel
nachdem alle Abonnenten haben die chance hatte, um den Wert zu true
.Das beantwortet noch immer nicht, was passiert, wenn einige Abonnenten set Cancel = false
und einige set Cancel = true
.Weiß jemand?Würde so etwas wie die folgenden werden benötigt?
public bool Cancel
{
get{ return this.cancel; }
set{ this.cancel = this.cancel || value; }
}
Andere Tipps
Nach dem standard-Ereignis generieren pattern in Windows Forms:
public event CancelEventHandler MyEvent;
protected void OnMyEvent(CancelEventArgs e) {
CancelEventHandler handler = MyEvent;
if (handler != null) {
handler(this, e);
}
}
private void button1_Click(object sender, EventArgs e) {
CancelEventArgs args = new CancelEventArgs();
OnMyEvent(args);
if (!args.Cancel) {
// Client code didn't cancel, do your stuff
//...
}
}
function OnMyCancelableEvent()
{
var handler = CancelableEvent;
var args = new CancelEventArgs()
if(handler != null)
{
handler(this, args)
if(args.Canceled)
// do my cancel logic
else
// do stuff
}
}