3

VS 2010 を使用していて、Yes|No|Cancel ダイアログを介してフォームを閉じるイベントをキャンセルしたいのですが、ダイアログ ボックスのイベント ハンドラーに e.Cancel を入れると、「'System.EventArgs'」というエラーが表示されます。 'Cancel' の定義が含まれておらず、タイプ 'System.EventArgs' の最初の引数を受け入れる拡張メソッド 'Cancel' が見つかりませんでした (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

4 に答える 4

5

FormClosingイベントには、独自のEventArgsサブクラスがあります。これは、イベントハンドラーのパラメーターとして使用する必要があります。

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はプロパティであり、メソッドのように呼び出しています。括弧を削除する必要があります。

于 2012-07-30T19:56:51.663 に答える
5

Form.FormClosingは、 のFormClosingEventArgs代わりにa を使用しEventArgsます。

以下を使用する必要があります。

private void displayMessageBox(object sender, FormClosingEventArgs e)

代わりに、古いForm.Closingイベントを使用すると、 ではなくCancelEventHandlerを使用するとして定義されます。CancelEventArgsEventArgs

private void displayMessageBox(object sender, CancelEventArgs e)

これらのいずれかを使用して、次のことができます。

 e.Cancel = true;
于 2012-07-30T19:55:34.747 に答える
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;


    }

}
于 2012-07-30T20:06:17.687 に答える
0

FormClosingEventArgsメソッド シグネチャで型を使用します。

private void displayMessageBox(object sender, FormClosingEventArgs e)

と:

e.Cancel = true;

または、参照をキャストして、その型としてアクセスします。

((FormClosingEventArgs)e).Cancel = true;
于 2012-07-30T20:01:43.317 に答える