[WinForm] UserControl 釋放資源的 OnHandleDestroyed 事件

  • 1680
  • 0
  • 2016-01-08

使用 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);
        }

 

 

以上有誤的話,請不吝嗇糾正,感謝。