Как пропустить подтверждение после нажатия кнопки "Отмена формы"
Я использую С#.
У меня есть форма 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;
}
}