如何使用for循环扫描ASP.net中页面中的所有控件?

问题描述:

如何使用for循环扫描ASP.net中页面中的所有控件?如何使用for循环扫描ASP.net中页面中的所有控件?

,我想验证所有textboxs'文本在一个for循环

最简单的解决方案将添加验证器到文本框(即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); 
    } 
} 

有几种方法可以做到这一点。你可以通过使用基类Control类的递归来实现,从任何必要的点开始,并引用controlInstance.Controls来获得子控件测试,以查看它们是否是文本框。这不是最佳的。

您还可以保留对这些文本框的引用列表,并使用它们循环遍历它们。这更快,更高效。你可以用一串字符串和FindControl来做同样的事情。

你也可以使用内置的验证器,所以你不必这样做。当然,有限制。

当我用的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));