如何在FormClosing事件中显示MessageBox以提示取消?

时间:2012-03-10 07:00:23

标签: c# winforms

我正在使用此代码,但它不起作用,我做错了什么?

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    if (MessageBox.Show("This will close down the whole application. Confirm?", "Close Application", MessageBoxButtons.YesNo) == DialogResult.Yes)
    {
        MessageBox.Show("The application has been closed successfully.", "Application Closed!", MessageBoxButtons.OK);
    }
    else
    {
        e.Cancel = true;
        this.Activate();
    }
}

3 个答案:

答案 0 :(得分:4)

我猜你从某个地方复制了这段代码而忘了实际订阅FormClosing事件。在C#中常见的陷阱,VB.NET使用Handles关键字来避免这样的错误。选择表单,单击“属性”窗口中的闪电图标,然后双击“FormClosing”以添加订阅该事件的代码。

也就是说,编写这样的代码实际上没有意义。事件是其他代码来获取通知,类不必监听其自己的事件。在Winforms中,每个事件都由您可以覆盖的受保护的OnXxxx()方法触发。您可以剪切并粘贴下面的代码并落入成功的范围,它不需要任何额外的代码,如事件订阅代码。最重要的是,它首先优先考虑自定义事件处理程序,还有你还不知道的代码类型,并且应该首先处理通知。

    protected override void OnFormClosing(FormClosingEventArgs e) {
        base.OnFormClosing(e);
        if (!e.Cancel) {
            if (MessageBox.Show("Really?", "Close", MessageBoxButtons.YesNo) != DialogResult.Yes) {
                e.Cancel = true;
            }
        }
    }

答案 1 :(得分:0)

事件处理程序是否附加到表单?要检查,请转到表单属性,然后转到事件选项卡,看看FormClosing事件是否存在Form1_FormClosing。

答案 2 :(得分:0)

如果已使用 FormName.ShowDialog()打开此表单,则在 FormClosing 事件中,仅设置 e.Cancel = True。
您需要将 FormName.DialogResult 设置为 DialogResult.None ,如MSDN

中明确记录的那样