web-dev-qa-db-ja.com

UserControlが破棄されていることを通知するイベントは何ですか?

Webサーバーから取得した情報を表示するUserControl派生コントロールがあります。現在、応答性を改善するために、コントロールの初期化を非同期にしています。

LoadイベントハンドラーでCancellationTokenSourceを作成し、関連するトークンをさまざまな非同期呼び出しで使用しています。

非同期操作が完了する前にユーザーがフォームを閉じると、操作がキャンセルされることを確認したいと思います。つまり、トークンでCancelを呼び出したいのです。

私はwhereを理解しようとしています。トラップできるUnloadイベントがあった場合、それは完璧でしょう。しかし、そうではありません。実際、適切なイベントは見つかりません。

I could含まれるフォームのcloseイベントをトラップしますが、UserControlのすべてをローカルに保持したかったのです。

提案?

37
Gary McGill

Control :: HandleDestroyed イベントをお勧めします。基になるHWndが破棄されると(通常、親フォームが閉じられると発生します)発生します。独自のUserControlで処理するには、 OnHandleDestroyed をオーバーライドする必要があります。

コントロールはまだ破棄されていないため、この時点でコントロールのプロパティに完全にアクセスできます。

37
Stephan

別の解決策

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

Disposed イベントを使用しないのはなぜですか?

フォームが閉じられると、フォーム自体でDisposeが呼び出され、すべての子コントロールも再帰的に破棄されます。

1
sloth

これを試して:

UserControl.Dispose();
0
Gimhan