Sunday, December 23, 2018

Windows Form 無法存取已處置的物件?

Go to English Verison

這到底發生了什麼事情?
System.ObjectDisposedException: 無法存取已處置的物件
很正常的,微軟的中文版錯誤訊息不只難懂還可能讓人搞錯方向。他對應的英文訊息是:
Cannot access a disposed object.
這邊說的「已處置」就是"disposed",某個物件被處置掉了所以不能夠再被使用。
會看到這個錯誤訊息八成是因為你要Show()一個已經被使用者關閉的Windows Form。使用者很有可能直接點了視窗右上角的關閉按鈕,造成Close()被呼叫,接著Dispose()就會被執行。最後這個被「處置」的Form就不能夠被用了,因為處置掉了嘛。
解決這問題不難,再new一個Form就好了,如果不確定要不要再建置一個新的Form,可以拿 IsDisposed 判斷。
if (form1?.IsDisposed == true)
{
    form1 = new Form1();
}
如果你真的不想讓Form關閉然後被處置掉,另一個作法是把Form藏起來。你可以在Closing事件阻止Form的關閉然後隱藏。
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    e.Cancel = true; // 取消關閉作業
    Hide();          // 隱藏視窗
}