[OK] ボタンがクリックされたときに閉じないようにしたいダイアログがありますが、[OK] ボタンの代わりに AcceptButton プロパティが none に設定されていても返されます。閉じないようにする最善の方法は何ですか?
5 に答える
実際、間違ったプロパティを変更しています。AcceptButton
あなたは確かにOKボタンになりたいです. このプロパティは、Windows 用語の既定のボタンを決定します。ENTERキーボードを叩いたときに押すボタンです。変更するAcceptButton
ことで、ダイアログへのキーボード インターフェイスを壊すだけです。ボタンが押されたときに何が起こるかに影響を与えることはありません。
ボタンを押してフォームを閉じるかどうかを決定するため、DialogResult
ボタンのプロパティを設定する必要があります。DialogResult.None
次に、ボタンのクリック ハンドラー内で、ボタンの押下に応答する方法を決定する必要があります。ダイアログの検証が成功した場合は、フォームのDialogResult
プロパティを設定してダイアログを閉じる必要があると思います。例えば
private void OKbuttonClick(object sender, EventArgs e)
{
if (this.CanClose())
this.DialogResult = DialogResult.OK;
}
この動作を停止する最善の方法はDialogResult.None
、デザイン時に[OK]ボタンのDialogResultプロパティをプロパティウィンドウで変更することです。
また、[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();
}