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

本文关键字:扫描 控件 循环 for asp net | 更新日期: 2023-09-27 17:50:14

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

因为我想在一个for循环中验证所有文本框的文本

如何在asp.net中使用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做同样的事情。

您也可以使用内置的验证器,这样您就不必使用它了。当然,这也是有限制的。