使用 Form 时,我们可以从 FormClosing 事件知道 Form 准备要关闭了,
使用 UserControl 却没有这样对应的公开事件,
但 Control 已经有设计这样的 protected event,叫做 OnHandleDestroyed,
当调用 Dispose() 时,或者使用 using () {} 自动调用 Dispose() 时,就会触发 OnHandleDestroyed,
意思是控件的控制代码准备被终结,表示这个控件不能再继续使用,接着就等待被GC回收,
所以透过 override OnHandleDestroyed 事件,可以在里面将 UserControl 所产生的某些控件进行回收,
例如在UserControl 所产生的 Form 若还没释放资源,你希望在 UserControl 被释放资源前,
先将 Form 关闭,就能在UserControl 覆写的 OnHandleDestroyed 事件中处理释放资源,
例如以下 _form2 是全域变量的 Form型态,会先调用关闭方法后,再释放所有资源:
protected override void OnHandleDestroyed(EventArgs e)
{
if (_form2 != null)
{
using (_form2)
{
_form2.Close();
}
}
base.OnHandleDestroyed(e);
}
需不需要调用 Close 取决于 FormClosing 等关闭的事件中,有没有写相关的代码,
如果没有,也可以简单的直接写
protected override void OnHandleDestroyed(EventArgs e)
{
if (_form2 != null)
{
_form2.Dispose();
}
base.OnHandleDestroyed(e);
}
以上有误的话,请不吝啬纠正,感谢。
原文:大专栏 [WinForm] UserControl 释放资源的 OnHandleDestroyed 事件