it-swarm.com.de

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 werden. Ich bin gerade dabei, die Initialisierung der Steuerung asynchron zu machen, um die Reaktionsfähigkeit zu verbessern.

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

Ich möchte nun sicherstellen, dass der Vorgang abgebrochen wird, wenn der Benutzer das Formular schließt, bevor der asynchrone Vorgang abgeschlossen ist. Mit anderen Worten, ich möchte mit dem Token Cancel aufrufen.

Ich versuche, wo herauszufinden, um dies zu tun. Wenn es ein Unload-Ereignis gab, das ich einfangen könnte, wäre das perfekt - aber es gibt kein. Tatsächlich kann ich keine Veranstaltung finden, die geeignet erscheint.

Ich könnte das close-Ereignis für das enthaltende Formular abfangen, aber ich wollte wirklich alles lokal in meinem UserControl behalten.

Vorschläge?

35
Gary McGill

Ich schlage das Control :: HandleDestroyed event vor. Es wird ausgelöst, wenn das zugrunde liegende HWnd zerstört wird (was normalerweise geschieht, wenn das übergeordnete Formular geschlossen wird). Um es in Ihrem eigenen UserControl zu behandeln, sollten Sie OnHandleDestroyed überschreiben.

Sie haben zu diesem Zeitpunkt vollen Zugriff auf die Eigenschaften des Controls, da es noch nicht entsorgt wurde.

36
Stephan

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
    }
11
Avram

Warum verwenden Sie nicht einfach das Ereignis Disposed ?

Wenn ein Formular geschlossen wird, ruft es Dispose für sich selbst auf und alle untergeordneten Steuerelemente werden ebenfalls rekursiv verworfen.

1
sloth

Versuche dies:

UserControl.Dispose();
0
Gimhan