談到模式窗體的關閉,先來看一下模式窗體關閉後的返回值。無論是調用Form.ShowDialog ()方法還是Form.ShowDialog (IWin32Window)方法,都會在模式窗體關閉時返回System.Windows.Forms.DialogResult枚舉值。參考 MSDN,該枚舉包含的值如下,
DialogResult.Abort,對話框的返回值是 Abort(通常從標簽為“中止”的按鈕發送)。
DialogResult.Cancel,對話框的返回值是 Cancel(通常從標簽為“取消”的按鈕發送)。
DialogResult.Ignore,對話框的返回值是 Ignore(通常從標簽為“忽略”的按鈕發送)。
DialogResult.No,對話框的返回值是 No(通常從標簽為“否”的按鈕發送)。
DialogResult.None,從對話框返回了 Nothing。這表明有模式對話框繼續運行。
DialogResult.OK,對話框的返回值是 OK(通常從標簽為“確定”的按鈕發送)。
DialogResult.Retry,對話框的返回值是 Retry(通常從標簽為“重試”的按鈕發送)。
DialogResult.Yes,對話框的返回值是 Yes(通常從標簽為“是”的按鈕發送)。
由於某些原因在實際用戶操作中比如選項數據無法保存,輸入的設置數據有問題,點擊[確定]按鈕需要阻止窗體的關閉以
對輸入的設置進行調整。對於一些開發者在技術社區貼的阻止模式窗體關閉的代碼,我認為不是很好的實現。以下用代碼來描述該實現,注意其中用到了三個事件。
//注冊窗體關閉事件
this.FormClosing += new
System.Windows.Forms.FormClosingEventHandler(this.OptionForm_FormClosing);
//注冊確定按鈕事件
this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click);
//注冊取消按鈕事件
this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click);
三個事件對應的事件處理程序如下,
//確定按鈕處理程序
private void buttonOK_Click(object sender, EventArgs e)
{
//假設textBoxPath用來記錄目錄路徑,如果不存在要求用戶重新設置。
if (this.textBoxPath.Text.Trim().Length == 0)
{
MessageBox.Show(輸入路徑信息不對!);
this.textBoxPath.Focus();
}
else
{
this.DialogResult = DialogResult.OK;
}
}
//取消按鈕處理程序
private void buttonCancel_Click(object sender, EventArgs e)
{
this.DialogResult = DialogResult.Cancel;
}
//窗體關閉處理程序,在關閉窗體時發生。
private void OptionForm_FormClosing(object sender, FormClosingEventArgs e)
{
if (this.DialogResult != DialogResult.Cancel && this.DialogResult !=
DialogResult.OK)
e.Cancel = true;
}