2009-11-19 2 views
2

.NET CF에서 제어 유효성 검사를 강제 적용 할 수있는 방법이 있습니까? 전체 .NET에는 Validate() 메서드가 있지만 CF에서는이 메서드가 없습니다.Compact Framework에서 폼/컨트롤의 유효성을 강제로 적용하려면 어떻게합니까?

양식을 닫을 때 모델에 컨트롤 데이터를 다시 바인딩하려고하지만 기본 메뉴 단추를 클릭해도 컨트롤에서 포커스를 훔치는 것처럼 보이지 않으며 유효성 검사 및 유효성 검사 이벤트가 발생하지 않습니다.

이 문제의 해결 방법에 대해 알고 계십니까?

답변

3

나는 약 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; 
    } 

} 
+0

흥미로운 접근법 - 래퍼에 이러한 Validate 메소드를 얼마나 정확하게 구현 했습니까? 사실 제 3 자 컨트롤 (Resco DetailView)에서이 문제를 겪고 있으며 동일한 기술을 적용 할 수 있는지 궁금합니다. 이 컨트롤을 상속 받았습니까? 디자인 타임 지원을 유지 관리 했습니까? –

+0

코드를 보내 주셔서 감사합니다. 전에 DataBindings [string] .WriteValue를 보지 못했습니다.내 답변에 따라 귀하의 접근 방식을 따를 필요는 없지만 데이터를 다시 바인딩해야 할 필요가있는 경우 귀하의 대답은 매우 유용 할 것입니다. –

0

누구나 유용하다고 생각되는 경우 적용한 해결 방법을 설명합니다.

확인 처리기에서 유효성을 검사하려는 컨트롤이 들어있는 패널에 포커스가있는 코드를 추가했습니다. 데이터 편집 컨트롤이 포커스를 잃으면 Validating 및 Validated 이벤트를 발생시키고 데이터를 모델 클래스에 다시 바인딩합니다. 이렇게하면 폼 (btw는 '마법사'의 많은 부분에 대해 일반적이며 화면이로드되는 패널 만 알고 있음)은 컨트롤의 유효성을 검사 할 수 있습니다.

해킹 비트이지만 지금은 할 것입니다.

+0

코드 샘플로 나의 대답을 업데이트했습니다. 이전에 말한 것처럼 포커스 이벤트를 사용하여 양식의 유효성을 검사했습니다. 그러나, 나는 그것에 운이 없었다. 컴팩트 프레임 워크에서 폼을 검증하는 쉬운 방법이 없다는 사실은 꽤 이상합니다. – empi

0

다른 컨트롤에 초점을 맞춤을 통해 Validating 및 Validated 이벤트를 트리거하려면 AutoValidate 속성을 AutoValidate.EnableAllowFocusChange로 설정해야한다고 생각합니다.

희망이 있습니다. =]

관련 문제