2011-04-14 5 views

답변

5

가장 쉬운 솔루션 내가 웹폼을 사용하는 데 사용하는 경우

0

. 필요할 때마다 시작하여 controlInstance.Controls를 참조하여 기본 컨트롤 클래스를 사용하여 재귀를 수행하여 자식 컨트롤이 텍스트 상자인지 테스트 할 수 있습니다. 이것은 최적이 아닙니다.

또한 이러한 텍스트 상자에 대한 참조 목록을 유지하고이를 사용하여 반복 할 수도 있습니다. 이것은 더 빠르고 효율적입니다. 문자열 배열과 FindControl을 사용하여 동일한 작업을 수행 할 수 있습니다.

내장 된 검사기를 사용할 수도 있으므로 사용할 수 있습니다. 물론 제한이 있습니다.

public static class PageExtensions 
{ 
    public static IEnumerable<Control> All(this ControlCollection controls) 
    { 
     foreach (Control control in controls) 
     { 
      foreach (Control grandChild in control.Controls.All()) 
      { 
       yield return grandChild; 
      } 

      yield return control; 
     } 
    } 
} 

그리고 페이지의 모든 텍스트 상자를 선택하려면이 기능을 사용하려면 :

this.Form.Controls 
    .All() 
    .OfType<TextBox>() 
    .ToList() 
    .ForEach(t => Validate(t.Text)); 
4

, 나는 내가 만든 거라고 확장 방법을했다 Validators를 텍스트 상자에 추가하는 것입니다 (예 : RequiredFieldValidator). 그것들은 사용자 정의 오류 메시지를 지정할 수있게하며, 코드 내에서 단순히 Page.Validate()를 호출하여 검사 할 수 있습니다.

옵션이 아닌 경우 ASP.Net 컨트롤은 계층 구조에 중첩되어 있으므로 일부 재귀를 사용하여 페이지의 모든 텍스트 상자를 선택해야합니다. 다음 함수 코드는 페이지의 모든 컨트롤 컬렉션을 반복하고 텍스트 상자가 비어 있으면 오류 메시지를 추가합니다.

protected void buttonClick(object sender, EventArgs e) 
{ 
    List<String> errors = new List<String>(); 
    ValidateTextboxes(errors, this.Controls); 
    if (errors.Count > 0) 
    { 
     // Validation failed 
    } 
} 

protected void ValidateTextboxes(List<String> errors, ControlCollection controls) 
{ 
    foreach (Control control in controls) 
    { 
     if (control is TextBox) 
     { 
      // Validate 
      TextBox tb = control as TextBox; 
      if (tb.Text.Length == 0) 
       errors.Add(tb.ID + ": field is required:"); 
     } 

     if (control.Controls.Count > 0) 
      ValidateTextboxes(errors, control.Controls); 
    } 
} 
관련 문제