Frage Welches Ereignis signalisiert, dass ein UserControl zerstört wird?


Ich habe ein von UserControl abgeleitetes Steuerelement, das einige Informationen anzeigt, die von einem Webserver abgerufen wurden. Ich bin gerade dabei, die Initialisierung der Steuerung asynchron durchzuführen, um die Reaktionsfähigkeit zu verbessern.

In meinem Load-Ereignishandler erstelle ich eine CancellationTokenSource und verwende das zugehörige Token in den verschiedenen Async-Aufrufen.

Ich möchte jetzt sicherstellen, dass der Vorgang abgebrochen wird, wenn der Benutzer das Formular vor Abschluss der asynchronen Operation schließt. Mit anderen Worten, ich möchte auf dem Token Cancel aufrufen.

Ich versuche herauszufinden woher um dies zu tun. Wenn es ein Unload-Ereignis gäbe, das ich einfangen könnte, wäre das perfekt - aber das ist nicht der Fall. Tatsächlich kann ich kein passendes Ereignis finden.

ich könnte Trap das Close-Ereignis für das enthaltende Formular, aber ich wollte wirklich alles lokal zu meinem UserControl behalten.

Vorschläge?


29
2017-09-18 09:54


Ursprung


Antworten:


Ich schlage vor Steuerung :: HandleDestroyed Veranstaltung. Es wird ausgelöst, wenn das zugrundeliegende HWnd zerstört wird (was normalerweise passiert, wenn das Elternformular geschlossen wird). Um es in Ihrem eigenen Benutzersteuerelement zu behandeln, sollten Sie es überschreiben OnHandleZerstört.

Sie haben in diesem Moment vollen Zugriff auf die Eigenschaften des Steuerelements, da es noch nicht entsorgt wurde.


32
2017-09-18 10:08



Eine andere Lösung

    protected override void OnParentChanged(EventArgs e)
    {
        base.OnParentChanged(e);

        if (parentForm != null)
        {
            parentForm.Closing -= parentForm_Closing;
        }
        parentForm = FindForm();

        if (parentForm != null)
            parentForm.Closing += parentForm_Closing;
    }

    void parentForm_Closing(object sender, System.ComponentModel.CancelEventArgs e)
    {
        parentForm.Closing -= parentForm_Closing;
        parentForm = null;
        //closing code
    }

10
2018-02-12 10:22



Warum nicht einfach das benutzen? Disposed Veranstaltung?

Wenn ein Formular geschlossen wird, wird es anrufen Dispose auf sich selbst und alle untergeordneten Steuerelemente werden ebenfalls rekursiv angeordnet.


1
2017-09-18 09:57



Versuche dies:

UserControl.Dispose();

0
2017-09-18 10:41