如何在asp.net中使用for循环扫描页面中的所有控件
本文关键字:扫描 控件 循环 for asp net | 更新日期: 2023-09-27 17:50:14
如何使用for循环扫描页面中的所有控件?
因为我想在一个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);
}
}
当我使用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));
有几种方法可以做到这一点。您可以使用Control基类递归完成此操作,从任何必要的点开始并引用controlInstance。控件来让子控件进行测试,看看它们是否是文本框。这不是最优的。
您还可以保留对这些文本框的引用列表,并使用该列表循环遍历它们。这样更快更有效。你也可以对字符串数组和FindControl做同样的事情。
您也可以使用内置的验证器,这样您就不必使用它了。当然,这也是有限制的。