使用linq获取网页中某种类型的Web控件列表

Ton*_*ich 2 linq asp.net recursion web-controls

有没有办法使用linq获取网页中的文本框列表,无论它们在树层次结构或容器中的位置如何.因此,不是循环遍历每个容器的ControlCollection来查找文本框,而是在linq中执行相同的操作,可能在单个linq语句中?

Pet*_*ter 12

我见过的一种技术是在ControlCollection上创建一个返回IEnumerable的扩展方法......如下所示:

public static IEnumerable<Control> FindAll(this ControlCollection collection)
{
    foreach (Control item in collection)
    {
        yield return item;

        if (item.HasControls())
        {
            foreach (var subItem in item.Controls.FindAll())
            {
                yield return subItem;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这处理递归.然后你就可以在你的页面上使用它,如下所示:

var textboxes = this.Controls.FindAll().OfType<TextBox>();
Run Code Online (Sandbox Code Playgroud)

这将为您提供页面上的所有文本框.您可以更进一步,构建一个处理类型过滤的扩展方法的通用版本.它可能看起来像这样:

public static IEnumerable<T> FindAll<T>(this ControlCollection collection) where T: Control
{
    return collection.FindAll().OfType<T>();
}
Run Code Online (Sandbox Code Playgroud)

你可以像这样使用它:

var textboxes = this.Controls.FindAll<TextBox>().Where(t=>t.Visible);
Run Code Online (Sandbox Code Playgroud)