WinForm的技巧(1 of n)窗口关闭的提示

我将通过本文向大家介绍添加"窗口关闭的提示"的恰当做法。

在程序运行时,可以通过点击右上角的红叉,关闭一个窗体;也可以通过调用窗体的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 的赋值语句影响其它的事件处理结果。

posted @ 2008-09-03 23:01  王伟晔  阅读(2608)  评论(0编辑  收藏  举报