什么事件表明UserControl被销毁?

Gar*_*ill 38 .net c# events asynchronous winforms

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

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

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

我想弄清楚在哪里这样做.如果有一个我可以陷阱的卸载事件,那么这将是完美的 - 但事实并非如此.事实上,我找不到任何看起来合适的事件.

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

建议?

Ste*_*han 38

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

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

  • 请注意,在设计器中使用控件时会调用此方法.有人可能想在覆盖体中使用if(!DesignMode). (4认同)

Avr*_*ram 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
    }
Run Code Online (Sandbox Code Playgroud)

  • 如果control是另一个控件的子节点,那么这将不起作用 - 当父节点更改时,父节点仍为空.解决方案也是处理VisibleChanged事件. (4认同)