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)