如何使用for循环扫描ASP.net中页面中的所有控件?
答
最简单的解决方案将添加验证器到文本框(即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));