e.Cancel不起作用

时间:2012-07-30 19:51:20

标签: c#

我有VS 2010并希望通过Yes | No | Cancel对话框取消表单结束事件,但当我将e.Cancel放入对话框的事件处理程序时,我收到一条错误消息“'System .EventArgs'不包含'Cancel'的定义,并且没有扩展方法'Cancel'接受类型'System.EventArgs'的第一个参数可以找到(你是否缺少using指令或汇编引用?)。“ “取消”一词下面也有一条红线。我在网上看到的一切都说这是取消FormClosing活动的唯一方法。我测试了VS2008中的代码,它做了同样的事情。

事件处理程序的代码如下:

private void displayMessageBox(object sender, EventArgs e)
        {
        DialogResult result = MessageBox.Show("Do you want to save the changes to the document before closing it?", "MyNotepad",MessageBoxButtons.YesNoCancel, MessageBoxIcon.Warning);
        if (result == DialogResult.Yes)
        {
            saveToolStripMenuItem_Click(sender, e);
        }
        else if (result == DialogResult.No)
        {
            rtbMain.Clear();
            this.Text = "Untitled - MyNotepad"; 
        }
        else if (result == DialogResult.Cancel)
        {
            // Leave the window open.
            e.Cancel() = true;


        }

以下是使用(如果它有所不同):

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

4 个答案:

答案 0 :(得分:5)

Form.FormClosing使用FormClosingEventArgs而非EventArgs

您需要使用:

private void displayMessageBox(object sender, FormClosingEventArgs e)

如果您使用较早的Form.Closing事件,则将其定义为CancelEventHandler,其使用CancelEventArgs,而不是EventArgs

private void displayMessageBox(object sender, CancelEventArgs e)

使用其中任何一个,您就可以:

 e.Cancel = true;

答案 1 :(得分:4)

FormClosing eventits own EventArgs subclass,您应该将其作为事件处理程序的参数:

private void displayMessageBox(object sender, FormClosingEventArgs e)
{
    DialogResult result = MessageBox.Show("Do you want to save the changes to the document before closing it?", "MyNotepad", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Warning);
    if (result == DialogResult.Yes)
    {
        saveToolStripMenuItem_Click(sender, e);
    }
    else if (result == DialogResult.No)
    {
        rtbMain.Clear();
        this.Text = "Untitled - MyNotepad"; 
    }
    else if (result == DialogResult.Cancel)
    {
        // Leave the window open.
        e.Cancel = true;
    }
}

此外,e.Cancel是一个属性,您将其称为方法。需要删除括号。

答案 2 :(得分:0)

在方法签名中使用FormClosingEventArgs类型:

private void displayMessageBox(object sender, FormClosingEventArgs e)

e.Cancel = true;

或者转换引用以将其作为该类型访问:

((FormClosingEventArgs)e).Cancel = true;

答案 3 :(得分:0)

非常简单>>

使用 FormClosing 事件:

private void frmMain_FormClosing(object sender, FormClosingEventArgs e)
{
    displayMessageBox(this, e);
}

private void displayMessageBox(object sender, FormClosingEventArgs e)
{
    DialogResult result = MessageBox.Show("Do you want to save the changes to the document before closing it?",
                                            "MyNotepad", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Warning);
    if (result == DialogResult.Yes)
    {
         saveToolStripMenuItem_Click(sender, e);
    }
    else if (result == DialogResult.No)
    {
           rtbMain.Clear();
        this.Text = "Untitled - MyNotepad";
    }
    else if (result == DialogResult.Cancel)
    {
        // Leave the window open.
        e.Cancel = true;


    }

}