Я боролся с тем же вопросом около года назад. Все, что я нашел в Интернете, было довольно неприятным (т. Е. Перебирать элементы управления и улавливать каждый фокус управления, тем самым активируя проверку события или какое-то решение, которое сильно полагалось на pinvoke или отражение - я точно не помню).
Я закончил создание оберток, которые включали метод Validate для моих текстовых полей и т. Д. И сохраняя коллекцию этих оберток. Таким образом, я мог бы перебирать свои обертки и проверять правильность каждого элемента управления.
Это решение отлично работает. Сначала я попробовал решение с программным улавливанием каждого фокуса управления, но у меня было много проблем с ним. Потеряв некоторое время, пытаясь улучшить это решение, я решил создать эти обертки, и это было очень хорошее решение.
ОБНОВЛЕНИЕ
Здесь, как это выглядело. Inform Заявляю список элементов управления, которые должны быть проверены:
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;
}
}
Интересный подход - как именно вы реализовали эти методы проверки в оболочках? У меня есть эта проблема с сторонним элементом управления (Resco DetailView), и мне интересно, можно ли применить такую же технику. Вы наследовали эти элементы управления? Вам удалось сохранить поддержку дизайна? –
Спасибо за код - не видели DataBindings [string] .WriteValue раньше.В соответствии с моим ответом мне не нужно было следовать вашему подходу, но если мне когда-либо понадобится принудительно привязать данные, ваш ответ будет очень полезен. –