web-dev-qa-db-ja.com

OKボタンがクリックされたときにShowDialog()が戻らないようにする

[OK]ボタンがクリックされたときに閉じないようにしたいダイアログがありますが、ダイアログが返され、[OK]ボタンの代わりにAcceptButtonプロパティがnoneに設定されていても表示されます。それが閉じるのを防ぐための最良の方法は何ですか?

16
user1151923

実際、間違ったプロパティを変更しています。あなたは確かに AcceptButton をOKボタンにしたいのです。このプロパティは、Windows用語でdefaultボタンがどれであるかを決定します。それはあなたが押すときに押されるボタンです ENTER キーボードで。 AcceptButtonを変更することで、ダイアログへのキーボードインターフェイスを壊すだけです。ボタンが押されたときに何が起こるかに影響を与えることはありません。

ボタンを押すとフォームが閉じるかどうかが決まるため、ボタンの DialogResult プロパティをDialogResult.Noneに設定する必要があります。次に、ボタンのクリックハンドラー内で、ボタンの押下に応答する方法を決定する必要があります。ダイアログの検証が成功した場合は、フォームの DialogResult プロパティを設定してダイアログを閉じる必要があると思います。例えば

private void OKbuttonClick(object sender, EventArgs e)
{
    if (this.CanClose())
        this.DialogResult = DialogResult.OK;
}
31
David Heffernan

この動作を停止する最善の方法は、設計時にプロパティウィンドウで[OK]ボタンのDialogResultプロパティをDialogResult.Noneに変更することです。

また、[OK]ボタンのクリックイベントにすでにコードがある場合は、DialogResultの形式を変更できます。

private void comOK_Click(object sender, EventArgs e)
{
    // your code .....

    // Usually this kind of processing is the consequence of some validation check that failed
    // so probably you want something like this
    if(MyValidationCheck() == false)
    {
        // show a message to the user and then stop the form closing with
        this.DialogResult = DialogResult.None;
    }
}
7
Steve

ボタン自体のDialogResultも削除する必要があります。ボタンのプロパティウィンドウで、ボタンをNoneに設定します。

http://msdn.Microsoft.com/en-us/library/system.windows.forms.button.dialogresult.aspx

このプロパティのDialogResultがNone以外に設定されていて、親フォームがShowDialogメソッドを介して表示された場合、ボタンをクリックすると、イベントをフックせずに親フォームが閉じます。

明らかに、ボタンは何もしないので、Clickイベントのハンドラーを登録する必要があります。

2

ベストプラクティスは、ユーザー入力に応答しないのではなく、実際にOkボタンを無効に設定することです。

DialogResultプロパティは、フォームに応じてOkまたはYesに設定する必要があり、AcceptButtonもOkにリンクする必要があります。

私は通常、すべてのダイアログで関数を作成し、ユーザーがデータを操作するたびにそれを呼び出します。

void RefreshControls() { button.Enabled = this.ValidateInput(); }

1
Raheel Khan