我將通過本文向大家介紹添加"視窗關閉的提示"的恰當做法。
在程式運行時,可以通過點擊右上方的紅叉,關閉一個表單;也可以通過調用表單的Close()方法關閉表單。如果想在表單關閉前向使用者提供一個提示框,防止重要訊息未被儲存就關閉,大家會怎麼做呢?很多人會想到在調用Close前加入資訊框代碼。但這個做法是不完美的,因為Close方法是被調用的,你不知道Close在會何處調用,而且你不可能到處都寫資訊框語句。正確的做法卻不是調用Close之前,而是調用Close"之後"
正確的做法是處理Form的FormClosing事件:
public delegate void FormClosingEventHandler(object sender, FormClosingEventArgs e);
public event FormClosingEventHandler FormClosing;
Form執行個體被調用Close()方法後,不是馬上銷毀表單而是建立FormClosingEventArgs執行個體e,作為參數發出FormClosing,在事件被處理完後,再檢查e.Cancel是否等於true,如果是true視窗撤銷銷毀,如果為false繼續銷毀Form。因此我們可以通過處理FormClosing事件,在處理當中對e.Cancel進行賦值,就可達到表單撤銷關閉,所以為什麼前面強調"之後"。例如,前面說到的可以這樣實現代碼:
…
this.FormClosing += new FormClosingEventHandler(Form1_FormClosing);
…
void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (MessageBox.Show(
"視窗關閉後,資料即將丟失!是否現在關閉視窗",
"提示",
MessageBoxButtons.OKCancel,
MessageBoxIcon.Question) != DialogResult.OK)
{
e.Cancel = true;
}
}
但要注意,這種處理常式一般來說只有e.Cancel = true;的代碼,沒有e.Cancel = false;的代碼。因為事件是屬於一種委託,委託是多播的。所以,有可能有多個事件處理程式碼片段,如果賦值將會影響整個委託的參數。這裡的需求是,一旦其中一個處理的程式碼片段e.Cancel=true,表單都不應該被關閉,所以應盡量避免e.Cancel=false 的指派陳述式影響其它的事件處理結果。