Я боролся с той же проблемой около года назад. Все, что я нашел в Интернете, было довольно неприятно (то есть перебирал элементы управления и ловил каждый фокус элемента управления, таким образом вызывая событие проверки или какое-то решение, которое в значительной степени зависело от пинвока или отражения - я точно не помню).
Я закончил тем, что создал упаковщики, которые включали метод Validate для моих текстовых полей и т. Д., И сохранил коллекцию этих оболочек. Таким образом, я мог бы перебирать свои обертки и вызывать validate для каждого элемента управления.
Это решение работало нормально. Сначала я попробовал решение с программной фиксацией каждого фокуса управления, но у меня было много проблем с ним. Потратив некоторое время на попытки улучшить это решение, я решил создать эти обертки, и это было очень хорошее решение.
UPDATE
Вот как это выглядело. Информировать Я объявляю список элементов управления, которые должны быть проверены:
private List<TextBoxWithValidation> textBoxesWithValidation;
В конструкторе я добавляю элементы управления в список:
TextBoxWithValidation emailTextBoxWithValidation = new TextBoxWithValidation(emailTextBox);
emailTextBoxWithValidation.AddValidationPair(Validator.ValidationType.VALIDATE_NOT_EMPTY, "ValidateNotEmptyEmail");
emailTextBoxWithValidation.AddValidationPair(Validator.ValidationType.VALIDATE_EMAIL, "ValidateEmailEmail");
textBoxesWithValidation.Add(emailTextBoxWithValidation);
Тогда я могу проверить форму:
private bool ValidateForm()
{
foreach (TextBoxWithValidation textBoxWithValidation in textBoxesWithValidation)
{
if (!textBoxWithValidation.Validate())
{
return false;
}
}
return true;
}
И текстовое поле с проверкой выглядит так:
class TextBoxWithValidation
{
class ValidationTypeMessagePair
{
public Validator.ValidationType ValidationType { get; set; }
public string ValidationMessage { get; set; }
public ValidationTypeMessagePair(Validator.ValidationType validationType, string validationMessage)
{
this.ValidationType = validationType;
this.ValidationMessage = validationMessage;
}
}
private List<ValidationTypeMessagePair> validationPairs;
private TextBox textBox;
public TextBoxWithValidation(TextBox textBox)
{
this.textBox = textBox;
this.textBox.DataBindings["Text"].DataSourceUpdateMode = DataSourceUpdateMode.Never;
validationPairs = new List<ValidationTypeMessagePair>();
}
public void AddValidationPair(Validator.ValidationType validationType, string validationMessage)
{
validationPairs.Add(new ValidationTypeMessagePair(validationType, validationMessage));
}
public bool Validate()
{
foreach (ValidationTypeMessagePair validationPair in validationPairs)
{
if (!Validator.Validate(validationPair.ValidationType, textBox, Messages.Localize(validationPair.ValidationMessage))) return false;
}
textBox.DataBindings["Text"].WriteValue();
return true;
}
public void ClearValidationStatus()
{
textBox.BackColor = System.Drawing.SystemColors.Window;
}
}