Как пропустить подтверждение после нажатия кнопки "Отмена формы"

Я использую С#. У меня есть форма Windows с полем редактирования и кнопкой "Отмена" . В поле редактирования есть код для проверки события. Код выполняется каждый раз, когда поле редактирования теряет фокус. Когда я нажимаю кнопку "Отмена" , я просто хочу закрыть форму. Я не хочу, чтобы какая-либо проверка для окна редактирования была выполнена. Как это можно сделать?

Вот важная деталь: если проверка не выполняется, то

            e.Cancel = true;

предотвращает выход из режима управления.

Но когда пользователь нажимает кнопку "Отмена" , форма должна быть закрыта независимо от того, что. как это можно реализовать?

Ответ 1

Если проверка выполняется, когда окно редактирования теряет фокус, ничего о кнопке отмены не остановится.

Однако, если неудачная проверка не позволяет кнопке отмены выполнить свою задачу, установите для свойства CausesValidation кнопку false.

Ссылка: Button.CausesValidation свойство

Ответ 2

Очевидно, что для свойства CausesValidation для кнопки должно быть установлено значение false, а при его нажатии никогда не произойдет проверочное событие. Но это может завершиться неудачно, если родительский элемент управления кнопки имеет свой CausesValidation Свойство, установленный в true. В большинстве случаев разработчики пропускают/забывают изменить свойство CausesValidation элемента управления контейнера (например, панели управления). Установите для этого также значение False. И это должно сделать трюк.

Ответ 3

У меня возникли проблемы с закрытием моей формы, поскольку проверка некоторых элементов управления остановила ее. Я установил control.CausesValidation = false для кнопки отмены и всех родителей кнопки отмены. Но все еще были проблемы.

Казалось, что если пользователь был в середине редактирования поля, использующего валидацию, и просто решил отказаться (оставив поле с недопустимым вводом), событие кнопки отмены запускалось, но окно не закрывалось вниз.

Это было зафиксировано в событии нажатия кнопки отмены:

private void btnCancel_Click(object sender, EventArgs e)
{
    // Stop the validation of any controls so the form can close.
    AutoValidate = AutoValidate.Disable;
    Close();
}

Ответ 4

Установите для свойства CausesValidation кнопку Отмена false.

Ответ 5

Задайте для свойства CausesValidation значение false.

Ответ 6

Ни один из этих ответов не выполнил эту работу, но последний ответ из этого потока. В принципе, вам необходимо:

  • Убедитесь, что кнопка Отмена (если есть) имеет .CausesValidation установлен на false
  • Отменить этот виртуальный метод.

    protected override bool ProcessDialogKey(Keys keyData) {
        if (keyData == Keys.Escape) {
            this.AutoValidate = AutoValidate.Disable;
            CancelButton.PerformClick();
            this.AutoValidate = AutoValidate.Inherit;
            return true;
        }
        return base.ProcessDialogKey(keyData);
    }
    

Я действительно не ответил на это, просто указав на двух парней, которые на самом деле это сделали.

Ответ 7

Разумное использование свойства Control.CausesValidation поможет вам достичь желаемого.

Ответ 8

Устанавливать ПричиныValidation на false - это ключ, однако этого недостаточно. Если родительские кнопки имеют значение CausesValidation равным true, событие проверки будет вызвано. В одном из моих случаев у меня была кнопка отмены на панели на форме, поэтому мне пришлось установить CausesValidation = false на панели, а также на форму. В конце концов я сделал это программно, поскольку это было проще, чем прохождение всех форм...

Control control = cancelButton;

while(control != null)
{
   control.CausesValidation = false;
   control = control.Parent;
}

Ответ 9

В дополнение к ответу Даниэля Шаффера: если проверка происходит, когда поле редактирования теряет фокус, вы можете запретить кнопку для активации в обход локальной проверки и выход в любом случае.

public class UnselectableButton : Button
{
    public UnselectableButton()
    {
        this.SetStyle(ControlStyles.Selectable, false);
    }
}

или если вы используете DevExpress:

this.simpleButtonCancel.AllowFocus = false;

Обратите внимание, что это приведет к изменению работы клавиатуры: вкладка больше фокусируется на кнопке отмены.

Ответ 10

Только над кодом проверки в поле редактирования добавьте:

if (btnCancel.focused)
  {
     return;
  }

Это должно сделать это.

Ответ 11

В моем случае, в форме я установил свойство AutoValidate в EnableAllowFocusChange

Ответ 12

С помощью мастера Visual Studio вы можете сделать это следующим образом:

enter image description here

Ответ 13

Возможно, вы хотите использовать BackgroundWorker, чтобы дать небольшую задержку, поэтому вы можете решить, должна ли проверка выполняться или нет. Здесь приведен пример исключения проверки при закрытии формы.

    // The flag
    private bool _isClosing = false;

    // Action that avoids validation
    protected override void OnClosing(CancelEventArgs e) {
        _isClosing = true;
        base.OnClosing(e);
    }

    // Validated event handler
    private void txtControlToValidate_Validated(object sender, EventArgs e) {           
        _isClosing = false;
        var worker = new BackgroundWorker();
        worker.DoWork += worker_DoWork;
        worker.RunWorkerAsync();
        worker.RunWorkerCompleted += worker_RunWorkerCompleted;
    }

    // Do validation on complete so you'll remain on same thread
    void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
        if (!_isClosing)
            DoValidationHere();
    }

    // Give a delay, I'm not sure this is necessary cause I tried to remove the Thread.Sleep and it was still working fine. 
    void worker_DoWork(object sender, DoWorkEventArgs e) {
        Thread.Sleep(100);
    }

Ответ 14

Это старый вопрос, однако я недавно столкнулся с этой проблемой и решил ее следующим образом:

Во-первых, мы загружаем UserControl в "оболочку" формы, в которой есть кнопка сохранения и отмены. UserControl наследует интерфейс (например, IEditView), который имеет функции для сохранения, отмены, проверки и ToggleValidate.

В форме оболочки мы использовали указатель мыши и указатель мыши:

    private void utbCancel_MouseEnter(object sender, EventArgs e)
    {
        ((Interface.IEdit)tlpMain.Controls[1]).ToggleValidate();
    }

    private void utbCancel_MouseLeave(object sender, EventArgs e)
    {
        ((Interface.IEdit)tlpMain.Controls[1]).ToggleValidate();
    }

Затем в ToggleValidate (скажем, в простой форме с двумя элементами управления... вы всегда можете просто пройтись по списку, если хотите), мы устанавливаем CausesValidation

    public bool ToggleValidate()
    {
        uneCalcValue.CausesValidation = !uneCalcValue.CausesValidation;
        txtDescription.CausesValidation = !txtDescription.CausesValidation;

        return txtDescription.CausesValidation;
    }

Надеюсь, это поможет.

Ответ 15

Я нашел эту ветку сегодня, когда выяснял, почему моя форма не закрывается при возникновении ошибки проверки.

Я попробовал CausesValidation = false на кнопке закрытия и на самой форме (X, чтобы закрыть).

Ничто не работало с этой сложной формой.

Читая комментарии, я обнаружил, что, кажется, работает отлично

на событии закрытия формы, а не на кнопке закрытия (поэтому она срабатывает и при нажатии X)

Это добилось цели.

AutoValidate = AutoValidate.Disable;

Ответ 16

Эта работа для меня.

private void btnCancelar_MouseMove(object sender, MouseEventArgs e)
{
    foreach (Control item in Form.ActiveForm.Controls)
    {
        item.CausesValidation = false;
    }
}