こんにちは私はいくつかのテキストボックスと2つのボタンキャンセルとOKを含むフォームを持っています。これらのボタンは、フォームのボタンプロパティを受け入れたりキャンセルしたりするために割り当てられています。問題は、すべてのテキストボックスに入力されたテキストを検証する必要があることです。
ユーザーがクリックした場合にそれを実行したいOkボタン(acceptButton))そこで、検証を担当する関数を作成し、ユーザーがクリックした場合にこの関数を起動しますOkボタン。問題は、検証関数がfalseを返しても、フォームが閉じるのを停止できないことです。これは、acceptbuttoプロパティをOkボタンに割り当てたために発生します。 acceptbuttonプロパティを削除せずに検証が失敗した場合に、フォームが閉じないようにする方法はありますか?
これは私たちが使用する実用的なソリューションです(そしてそれは他の回答からコンパイルされたものです)。
フォームが閉じないようにするには、DialogResult
をNone
に設定する必要があります。
//form init, auto-generated code (this is the case described)
private void InitializeComponent()
{
//....
this.AcceptButton = btnOk;
this.btnOk.DialogResult = DialogResult.OK;
//....
}
//event handlers
private void btnOK_Click(object sender, EventArgs e)
{
if (!Validate())
this.DialogResult = DialogResult.None;
}
private void Form_FormClosing(object sender, FormClosingEventArgs e)
{
if (this.DialogResult == DialogResult.None)
e.Cancel = true;
}
Okボタンクリックハンドラーで、検証が失敗したときにDialogResultをDialogResult.None
に変更します
1つの方法は、OnFormClosingイベントで検証を適用し、検証結果に基づいてアクションをキャンセルすることです。
-編集-
_private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (this.DialogResult == DialogResult.OK)
{
if (!IsValid())
{
Info("Invalid data");
e.Cancel = true;
}
else
{
Info("Valid data found, closing dialog");
}
}
else if (this.DialogResult == DialogResult.Cancel)
{
Info("Just cancelling!");
}
}
_
また、キャンセル/ OKイベントでthis.Close();
を呼び出すことができます。
または、[OK]ボタンの実装で、ボタンの DialogResult
を変更し、None
に設定することもできます。
_acceptButton.DialogResult = DialogResult.None;
_
フォームにAcceptButton
プロパティを設定したり、ボタンからDialogResult
プロパティを削除したりしないでください(代わりにDialogResult.None
に設定してください)。
代わりに、検証コードでフォームのDialogResultプロパティを設定できます。
if (allFieldsValidated) {
DialogResult = DialogResult.OK;
}
Button.DialogResultを設定しないでくださいデザイナまたは他の場所で(Form.DialogResultと混同しないでください)。ボタンのクリックハンドラーで検証を行い、成功した場合はForm.DialogResultをDialogResult.OKに設定して、フォームを閉じます。
private void OkBtn_Click(object sender, EventArgs e)
{
if (isValid())
{
this.DialogResult = DialogResult.OK;
this.Close();
}
}