4

(VS2005、.Net 2.0)

ShowDialog() メソッドを使用してダイアログとして表示されるフォームがあります。フォームの CancelButton プロパティは、フォームのボタンに設定されます。そのボタンの DialogResult を None に設定しても、ボタンをクリックするとダイアログが閉じます。私はこれを起こしてほしくありません - ダイアログを閉じるかどうかを制御できるようにしたいのです。

この問題は、フォームの AcceptButton では発生しません。そのボタンの DialogResult を none に設定すると、必要な処理を実行してから、フォームの DialogResult を手動で設定してフォームを閉じるかどうかを決定できます。

CancelButton プロパティは、Escape が押された場合に「クリック」する必要があるボタンを示すためだけのものであると考えました (AcceptButton は、Enter が押されたときに「クリック」するボタンのみを示すことになっているのと同じように)。私はこれで間違っていますか?フォームが閉じている他の理由を見逃していませんか? それともこれはバグですか?

編集:コードが追加されました。これはキャンセルボタン(ボタン1)を持つダイアログフォーム(フォーム2)です。キャンセル ボタンはフォームの CancelButton のみであり、DialogResult が Cancel に設定されていませんが、ボタンを押すとフォームが閉じられます

    private void InitializeComponent()
    {
        this.button1 = new System.Windows.Forms.Button();
        this.SuspendLayout();
        // 
        // button1
        // 
        this.button1.Name = "button1";
        this.button1.Text = "button1";
        // 
        // Form2
        // 
        this.CancelButton = this.button1;
        this.Controls.Add( this.button1 );
        this.Name = "Form2";
        this.Text = "Form2";
        this.ResumeLayout( false );
    }
4

4 に答える 4

7

また、Alt+F4 を押して X ボタンを押すことでフォームを閉じることができ、どちらの方法でもキャンセル ボタンのクリック イベントがトリガーされないことに注意してください。

これらの状況にも対処していない限り、スラッジのアドバイスに従い、FormClosing イベントでフォームが閉じないようにするのが最善ではないでしょう。

編集: また、[プロパティ] ウィンドウでボタンの DialogResult を [なし] に戻すと、デフォルト値に変更されることに注意してください。値がプロパティの既定値である場合、*.Designer.cs には保持されません。永続化された場合でも、フォームの初期化コードは *.Designer.cs の最後に配置され、次の行のために None を Cancel でオーバーライドします。

this.CancelButton = this.button1;

Reflector で確認できるように、前の行はこれを行います。

public void set_CancelButton(IButtonControl value)
{
    base.Properties.SetObject(PropCancelButton, value);
    if ((value != null) && (value.DialogResult == DialogResult.None))
    {
        value.DialogResult = DialogResult.Cancel;
    }
}

InitializeComponent() 呼び出しの後、コンストラクターで None に戻すことができます。

于 2009-11-20T12:07:46.833 に答える
5

Formのクローズのバリデーションを行いたいようです。
FormClosing イベントは、これに最適です。これにより、同じコードで閉じるかどうかを制御できます。
閉じるのを防ぐには、Cancel プロパティを true に設定するだけです。FormClosingを参照してください。

于 2009-11-20T11:51:05.267 に答える
3

これはデフォルトの動作です。

MSDNから:

このプロパティを使用すると、ユーザーがアプリケーションでESCキーを押したときに発生するデフォルトのアクションを指定できます。このプロパティを使用すると、ユーザーがマウスでキャンセルボタンを手動でクリックする代わりに、変更をコミットせずにESCキーを押すだけでウィンドウを閉じることができるため、ユーザーは簡単なフォームをすばやくナビゲートできます。

CancelButtonプロパティ

于 2009-11-20T11:46:04.640 に答える
1

Instead of trying to handle this in the button_click event, handle it in the form_closing event.

MyForm_FormClosing(object sender, FormClosingEventArgs e)
{
   if (DialogResult == DialogResult.Cancel)
   {
      // do my processing ...
      if (false)
         e.Cancel = true;   // stop the form from closing
   }
}

I handle my Accept button code here also, I assume anything != DialogResult.OK is a cancel, but you can do whatever is comfortable for you.

于 2011-02-21T20:34:24.170 に答える