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.

War es hilfreich?

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
   }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top