Ответ 1
Чтобы использовать проверочные обработчики, такие как обработчик 'txtIPAddress_Validating(), приведенный ниже, имея возможность закрыть форму без ввода допустимых записей для этого, я делаю следующее:
1) Инициировать проверки обработчиков. Из свойств управления элемента управления, для которого вы хотите активировать проверку, дважды щелкните событие "Проверка" из этого списка контрольных событий. Доступ к списку контрольных событий можно получить, щелкнув эту панель инструментов панели свойств объекта управления (молния). Затем вы можете ввести код в автоматически созданный обработчик с именем, объединяющим имя элемента управления и "_Validating". Часть этого обработчика, где что-то установлено как недействительное, может принудительно ввести действительные записи, добавив команду "e.Cancel = true".
Для таких примеров метода проверки см. Ниже код txtIPAddress_Validating() 'и' txtMaskBits_Validating(). Не отвлекайтесь на весь механизм проверки этих конкретных примеров. Все, что вам нужно, чтобы увидеть и воспроизвести в своем собственном коде для принудительной проверки, - это добавить инструкцию "e.Cancel = true" в нужном месте вашего собственного метода проверки. То есть когда значение идентифицируется как недопустимое.
На этом этапе проверка должна работать нормально, но любая попытка закрыть форму вызовет проверку, которая остановится и будет настаивать на действительных значениях, прежде чем сможет закрыть форму. Это не всегда то, что вы хотите. Когда это не так, я продолжаю следующее.
2) Кнопка "Отмена", которая также отменяет (отключает) все проверки:
a) Поместите обычную кнопку "Отмена" в форме, связанной с таким методом, как метод "btnCancel_Click()" ниже.
б) перед обычным 'this.close();' введите команду "AutoValidate = AutoValidate.Disable;" инструкция. Эта инструкция отключает все триггеры проверки. Обратите внимание, что событие "btnCancel_Click" запускается до того, как произойдет какая-либо проверка. Это не так для событий закрытия формы, которые будут выполняться после проверки событий. Вот почему эта проверка не может быть отключена из любого из этих событий закрытия формы.
c) Для правильной работы этой кнопки "Отмена" вам также необходимо установить свойство "CausesValidation" этой кнопки "Отмена" на "false". Это необходимо, иначе нажатие на эту кнопку приведет к проверке, прежде чем проверка может быть отключена с помощью вышеперечисленного "AutoValidate = AutoValidate.Disable;" инструкция.
На этом этапе вы должны уйти, нажав кнопку "Отмена", не вводя правильные значения. Однако нажатие на верхнюю правую кнопку "X" окна формы все равно будет принудительно проверять.
3) Сделать верхнюю правую кнопку "X" также отменить проверку:
Задача здесь заключается в том, чтобы захватить такое событие "X" нажатием, прежде чем выполняется проверка. Любая попытка сделать это с помощью обработчика закрытия формы не будет работать, потому что уже слишком поздно, когда выполнение достигает такого обработчика. Однако щелчок кнопки "X" можно быстро захватить, переопределив метод WndProc() и проверив условие "m.Msg == 0x10". Когда это условие истинно, ранее введенный "AutoValidate = AutoValidate.Disable;" инструкция снова может быть использована для отключения общей проверки в этом случае. См. Метод WndProc() ниже для образца кода такого метода. Вы должны иметь возможность копировать и вставлять этот метод, как в класс формы.
На этом этапе кнопки "Отменить" и "X" должны отменять валидации. Однако ключ эвакуации, который можно использовать для закрытия формы, не работает. Такой ключ запуска активируется, когда свойство "CancelButton" используется для связывания этого ключа эвакуации с формой "Отмена".
4) Сделать клавишу эвакуации также отменой проверки:
Подобно кнопке "X", клавиша эвакуации может быть захвачена путем переопределения существующего метода. Это метод ProcessDialogKey(). Еще один раз, ранее введенный "AutoValidate = AutoValidate.Disable;" инструкция может использоваться для отключения общей проверки для ключа эвакуации. См. "Переопределенный метод ProcessDialogKey() в коде ниже, чтобы узнать, как это можно сделать. Здесь вы также сможете копировать и вставлять этот метод, как в свой собственный класс формы.
На этом этапе вы должны быть сделаны!
Дальнейшие соображения:
Хорошо заметить, что следующие два других способа закрыть окно также должны отлично работать на этом этапе. Этими двумя способами являются:
- Параметр "Закрыть" кнопки значка верхнего левого окна.
- Нажатие Alt + F4, которое запускает те же действия закрытия, что и вышеописанная опция "Закрыть".
Эти два способа закрытия окна начали отменять проверку, как только вы представили механизм захвата кнопки "X", описанный в пункте 3 выше.
Это для меня до сих пор. Надеюсь, это поможет!
Мой пример кода ниже:
public partial class frmMyIP : Form
{
public frmMyIP()
{
InitializeComponent();
}
// To capture the Upper right "X" click
protected override void WndProc(ref Message m)
{
if (m.Msg == 0x10) // The upper right "X" was clicked
{
AutoValidate = AutoValidate.Disable; //Deactivate all validations
}
base.WndProc(ref m);
}
// To capture the "Esc" key
protected override bool ProcessDialogKey(Keys keyData)
{
if (keyData == Keys.Escape)
{
AutoValidate = AutoValidate.Disable;
btnCancel.PerformClick();
return true;
}
return base.ProcessDialogKey(keyData);
}
public bool IsValidIP(string ipaddr)
{
string pattern = @"^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])"+
@"(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$";
Regex check = new Regex(pattern);
bool valid = false;
if (ipaddr == "")
{
valid = false;
}
else
{
valid = check.IsMatch(ipaddr, 0);
}
return valid;
}
private void txtIPAddress_Validating(object sender, CancelEventArgs e)
{
string address = txtIPAddress.Text;
if (!IsValidIP(address))
{
MessageBox.Show("Invalid IP address!");
e.Cancel = true;
}
}
private void cmbMaskBits_Validating(object sender, CancelEventArgs e)
{
int MaskBitsValue = Convert.ToInt32(cmbMaskBits.Text);
if (MaskBitsValue<1 || MaskBitsValue>30)
{
MessageBox.Show("Please select a 'Mask Bits' value between 1 and 30!");
e.Cancel = true;
}
}
private void btnCancel_Click(object sender, EventArgs e)
{
// Stop the validation of any controls so the form can close.
// Note: The CausesValidation property of this <Cancel> button
// must also be set to false.
AutoValidate = AutoValidate.Disable;
this.Close();
}