什么事件表明UserControl正在被销毁?

时间:2012-09-18 09:54:34

标签: c# .net winforms events asynchronous

我有一个UserControl派生控件,显示从Web服务器获取的一些信息。我目前正在进行控制异步初始化,以提高响应能力。

在我的Load事件处理程序中,我正在创建一个CancellationTokenSource,并在各种异步调用中使用关联的Token。

我现在想确保如果用户在异步操作完成之前关闭表单,操作将被取消。换句话说,我想在令牌上调用取消。

我正在试图找出 where 来做到这一点。如果有一个我可以陷阱的卸载事件,那么这将是完美的 - 但事实并非如此。事实上,我找不到任何看起来合适的事件。

可以捕获包含Form的close事件,但我真的想保留UserControl的所有内容。

建议?

4 个答案:

答案 0 :(得分:36)

我建议Control::HandleDestroyed事件。当底层的HWnd被销毁时(通常在父窗体关闭时),它会被引发。要在您自己的UserControl中处理它,您应该覆盖OnHandleDestroyed

此时您可以完全访问Control的属性,因为它尚未被处理掉。

答案 1 :(得分:12)

另一种解决方案

    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
    }

答案 2 :(得分:1)

为什么不直接使用Disposed事件?

当表单关闭时,它将自行调用Dispose,并且所有子控件也将以递归方式处理。

答案 3 :(得分:0)

试试这个:

UserControl.Dispose();