С# AcceptButton и проверка
Привет
У меня есть форма, содержащая несколько текстовых полей и две кнопки Отмена и ОК. Эти кнопки назначаются для приема и отмены свойств кнопок в форме. Проблема в том, что я должен проверять тексты, введенные во все текстовые поля.
Я хочу сделать это, если пользователь нажмет кнопку "ОК" (который является acceptButton). Поэтому я написал функцию, которая отвечает за валидацию, и я запускаю эту функцию, если пользователь нажимает кнопку "ОК". Проблема в том, что я не могу остановить форму от закрытия, даже если функция проверки возвращает false. Это происходит из-за того, что я назначил свойство acceptbutto кнопке Ok. Есть ли способ предотвратить закрытие формы, если проверка не выполняется, не удаляя свойства acceptbutton?
Ответы
Ответ 1
Это рабочее решение, которое мы используем (и оно составлено из других ответов).
Вам просто нужно установить 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;
}
Ответ 2
Одним из способов может быть применение проверки в событии OnFormClosing и отмена действия на основе результата проверки.
- EDIT -
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!");
}
}
И вы можете вызвать this.Close();
в событиях Отмена/Ок.
В качестве альтернативы, в вашей реализации кнопки OK вы можете изменить DialogResult
и установить ее на None
;
acceptButton.DialogResult = DialogResult.None;
Ответ 3
В кнопке "ОК" нажмите "Обработчик", чтобы изменить диалог "Диалоговое окно" на DialogResult.None
, когда проверка не прошла.
Ответ 4
Не устанавливайте свойство AcceptButton
в своей форме и удаляйте свойство DialogResult
с вашей кнопки (вместо этого установите вместо него DialogResult.None
).
Вместо этого вы можете установить свойство DialogResult вашей формы в свой код проверки.
if (allFieldsValidated) {
DialogResult = DialogResult.OK;
}
Ответ 5
Не устанавливайте Button.DialogResult в конструкторе или в другом месте (не путайте с Form.DialogResult). В обработчике Click Button выполните проверку и, если успешно, установите Form.DialogResult в DialogResult.OK и закройте форму.
private void OkBtn_Click(object sender, EventArgs e)
{
if (isValid())
{
this.DialogResult = DialogResult.OK;
this.Close();
}
}