[OK]ボタンがクリックされたときに閉じないようにしたいダイアログがありますが、ダイアログが返され、[OK]ボタンの代わりにAcceptButtonプロパティがnoneに設定されていても表示されます。それが閉じるのを防ぐための最良の方法は何ですか?
実際、間違ったプロパティを変更しています。あなたは確かに AcceptButton
をOKボタンにしたいのです。このプロパティは、Windows用語でdefaultボタンがどれであるかを決定します。それはあなたが押すときに押されるボタンです ENTER キーボードで。 AcceptButton
を変更することで、ダイアログへのキーボードインターフェイスを壊すだけです。ボタンが押されたときに何が起こるかに影響を与えることはありません。
ボタンを押すとフォームが閉じるかどうかが決まるため、ボタンの DialogResult
プロパティをDialogResult.None
に設定する必要があります。次に、ボタンのクリックハンドラー内で、ボタンの押下に応答する方法を決定する必要があります。ダイアログの検証が成功した場合は、フォームの DialogResult
プロパティを設定してダイアログを閉じる必要があると思います。例えば
private void OKbuttonClick(object sender, EventArgs e)
{
if (this.CanClose())
this.DialogResult = DialogResult.OK;
}
この動作を停止する最善の方法は、設計時にプロパティウィンドウで[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;
}
}
ボタン自体のDialogResult
も削除する必要があります。ボタンのプロパティウィンドウで、ボタンをNone
に設定します。
http://msdn.Microsoft.com/en-us/library/system.windows.forms.button.dialogresult.aspx
このプロパティのDialogResultがNone以外に設定されていて、親フォームがShowDialogメソッドを介して表示された場合、ボタンをクリックすると、イベントをフックせずに親フォームが閉じます。
明らかに、ボタンは何もしないので、Click
イベントのハンドラーを登録する必要があります。
ベストプラクティスは、ユーザー入力に応答しないのではなく、実際にOkボタンを無効に設定することです。
DialogResultプロパティは、フォームに応じてOkまたはYesに設定する必要があり、AcceptButtonもOkにリンクする必要があります。
私は通常、すべてのダイアログで関数を作成し、ユーザーがデータを操作するたびにそれを呼び出します。
void RefreshControls() { button.Enabled = this.ValidateInput(); }