나는 약 1 년 전에 똑같은 문제로 고심했다. 웹에서 찾은 모든 것은 꽤 번거롭기 때문에 (즉, 컨트롤을 반복하고 모든 컨트롤 포커스를 잡아서 유효성 검사 이벤트를 실행하거나 핀볼이나 반사에 크게 의존하는 일부 솔루션 - 정확하게 기억하지 못합니다).
필자는 텍스트 상자 등의 유효성 검사 방법을 포함하고이 래퍼의 수집을 유지하는 래퍼를 만들었습니다. 이렇게하면 래퍼를 반복하고 모든 컨트롤에 대해 유효성 검사를 호출 할 수 있습니다.
그 솔루션은 잘 동작했습니다. 먼저 모든 컨트롤 포커스를 프로그래밍 방식으로 잡아서 솔루션을 시도했지만 많은 문제가있었습니다. 이 솔루션을 개선하기 위해 시간을 낭비 한 후에 이러한 래퍼를 만들기로 결정했으며 이는 매우 좋은 결정이었습니다.
업데이트
여기 어떻게 생겼는지. 나는 검증 할 필요가 컨트롤의 목록을 선언 통보 :
나는 목록에 컨트롤을 추가 생성자에서
private List<TextBoxWithValidation> textBoxesWithValidation;
:
private bool ValidateForm()
{
foreach (TextBoxWithValidation textBoxWithValidation in textBoxesWithValidation)
{
if (!textBoxWithValidation.Validate())
{
return false;
}
}
return true;
}
:
TextBoxWithValidation emailTextBoxWithValidation = new TextBoxWithValidation(emailTextBox);
emailTextBoxWithValidation.AddValidationPair(Validator.ValidationType.VALIDATE_NOT_EMPTY, "ValidateNotEmptyEmail");
emailTextBoxWithValidation.AddValidationPair(Validator.ValidationType.VALIDATE_EMAIL, "ValidateEmailEmail");
textBoxesWithValidation.Add(emailTextBoxWithValidation);
가 그럼 난 양식을 검증 할 수 있어요
유효성 검사가 포함 된 텍스트 상자는 다음과 같습니다.
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;
}
}
흥미로운 접근법 - 래퍼에 이러한 Validate 메소드를 얼마나 정확하게 구현 했습니까? 사실 제 3 자 컨트롤 (Resco DetailView)에서이 문제를 겪고 있으며 동일한 기술을 적용 할 수 있는지 궁금합니다. 이 컨트롤을 상속 받았습니까? 디자인 타임 지원을 유지 관리 했습니까? –
코드를 보내 주셔서 감사합니다. 전에 DataBindings [string] .WriteValue를 보지 못했습니다.내 답변에 따라 귀하의 접근 방식을 따를 필요는 없지만 데이터를 다시 바인딩해야 할 필요가있는 경우 귀하의 대답은 매우 유용 할 것입니다. –