2011-04-14 36 views

回答

5

最簡單的解決方案將添加驗證器到文本框(即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); 
    } 
} 
0

有幾種方法可以做到這一點。你可以通過使用基類Control類的遞歸來實現,從任何必要的點開始,並引用controlInstance.Controls來獲得子控件測試,以查看它們是否是文本框。這不是最佳的。

您還可以保留對這些文本框的引用列表,並使用它們循環遍歷它們。這更快,更高效。你可以用一串字符串和FindControl來做同樣的事情。

你也可以使用內置的驗證器,所以你不必這樣做。當然,有限制。

4

當我用的WebForms,我有我已經創建了一個擴展方法:

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));