Подтвердить что ты не робот

С# AcceptButton и проверка

Привет У меня есть форма, содержащая несколько текстовых полей и две кнопки Отмена и ОК. Эти кнопки назначаются для приема и отмены свойств кнопок в форме. Проблема в том, что я должен проверять тексты, введенные во все текстовые поля.

Я хочу сделать это, если пользователь нажмет кнопку "ОК" (который является acceptButton). Поэтому я написал функцию, которая отвечает за валидацию, и я запускаю эту функцию, если пользователь нажимает кнопку "ОК". Проблема в том, что я не могу остановить форму от закрытия, даже если функция проверки возвращает false. Это происходит из-за того, что я назначил свойство acceptbutto кнопке Ok. Есть ли способ предотвратить закрытие формы, если проверка не выполняется, не удаляя свойства acceptbutton?

4b9b3361

Ответ 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();
    }
}