Существует два вида проверки: проверка данных (на уровне постоянства) и проверка пользовательского интерфейса. Я предпочитаю ставить валидацию рядом со стороной ввода, потому что обычно вы хотите показать пользователю, что не так, и попытка подключить валидацию данных к пользовательскому интерфейсу добавляет больше косвенности, которая должна соответствовать косвенности привязки данных.
Включение проверки данных в контрольные классы не кажется хорошей идеей. Это в основном означает, что класс управления может использоваться только для одного определенного поля.
Стандартный способ работы Windows Forms - поместить проверку данных в контейнер . Таким образом, проверка может проверять состояние других свойств и подключать определенный элемент управления к объекту (ам) ErrorProvider для отображения соответствующего сообщения об ошибке.
class EmployeeForm : UserControl
{
EmployeeObject employee;
// ...
void employeeNameTextBox_Validating (object sender, CancelEventArgs e)
{
if ( employee.Name.Trim ().Length == 0 ) {
errorProvider.SetError (employeeNameTextBox, "Employee must have a name");
e.Cancel = true;
}
}
void employeeHireDateControl_Validating (...)
{
if ( employee.HireDate < employee.BirthDate ) {
errorProvider.SetError (employeeHireDateControl,
"Employee hire date must be after birth date");
e.Cancel = true;
}
}
}
class ExplorerStyleInterface : ...
{
// ...
bool TryDisplayNewForm (Form oldForm, Form newForm)
{
if ( ! oldForm.ValidateChildren () )
return false;
else {
HideForm (oldForm);
ShowForm (newForm);
return true;
}
}
}
Стандартным способом WF является запуск события Validating для конкретного элемента управления, когда элемент управления теряет фокус или когда ValidateChildren вызывается для контейнера (или контейнера контейнера). Вы устанавливаете обработчик для этого события через свойства события для элемента управления в контейнере; обработчик автоматически добавляется в контейнер.
Я не уверен, почему этот способ не работает для вас, если только вам не нравится поведение по умолчанию отказа от повторной фокусировки на ошибке, которое вы можете изменить, установив свойство AutoValidate контейнера (или контейнер) в EnableAllowFocusChange.
Расскажите нам конкретно, что вам не нравится в стандартном способе работы Windows Forms, и, возможно, мы можем либо предложить альтернативы, либо убедить вас, что стандартный способ будет делать то, что вы хотите.