linq 查找页面某一类型控件
如何用linq查找页面某一类型的控件,以前看到过,很简洁。 --------------------编程问答-------------------- http://brendan.enrick.com/post/Fun-With-Web-Forms-Controls-and-LINQ.aspxhttp://topic.csdn.net/u/20110416/11/5975fda8-13e1-4a68-8286-cbda743b08db.html --------------------编程问答--------------------
this.Controls.Cast<Control>.Where(x => x is TextBox).ToList().ForEach(x => MessageBox(x.Text));--------------------编程问答-------------------- 确实很简洁的
不过 一直不太习惯 linq --------------------编程问答-------------------- 在你的一个public static类中写下这个代码
public static IEnumerable<Control> FindAllControls(this Control ctrl)
{
foreach (Control c in ctrl.Controls)
yield return c;
foreach (Control c in ctrl.Controls)
foreach (Control cc in FindAllControls(c))
yield return cc;
}
注意,linq是使用迭代器的,也就是它根本不会去把一堆控件先装到内存里的什么List<Control>,而是会一个一个迭代搜索。所以它占用内存资源少。
比如你要在一个GridView中搜寻所有cssClass为noem的LinkButton,并且它所在的行中一定有一个Label控件或者是一个LiteralControl控件的Text值包含着namo这个单词(注意即使所搜索的控件是在用户控件等GridViewItem.FindControl方法找不到的地方),假设我们要把这些LinkButton的color统一设置为red,可以这样写:
var query=from LinkButton btn in this.GridView1.FindAllControls()
where btn.CssClass=="noem"
let row= btn.NamingContainer as DataGridItem
let subquery= from c in row.FindAllControls()
where (c is Label && ((Label)c).Text.Contains("namo")) ||( c is LiteralControl && ((LiteralControl )c).Text.Contains("namo"))
select c
where subquery.Any()
select btn;
foreach (var c in query)
c.ForeColor = Color.Red;
虽然linq有无以伦比的“迭代”特性,也不要滥用它。可以直接使用一条FindControl指令的地方,尽量不要去使用这个查询方法。这个查询方法是使用宽度优先搜索去自顶向下遍历所有控件,而FindControl方法是按照asp.net控件的INamingContainer范围去搜索(并且有内部优化的索引表),后者要小得多,而且快得多。通常我只是在自动化测试程序中才去这样查找控件。 --------------------编程问答-------------------- 哦,少了一个判断,重新修改一下:
public static IEnumerable<Control> FindAllControls(this Control ctrl)--------------------编程问答-------------------- 当然,你要理解有关扩展方法的概念,也要知道Linq,还要知道asp.net控件的嵌套层次概念,还要知道树的遍历的概念。最后,要知道为什么应该使用FindControl而不是这类遍历方法,还要知道FindControl到底是怎么查询的(不是这样查询的)。 --------------------编程问答-------------------- mark --------------------编程问答--------------------
{
if (ctrl == null)
yield break;
foreach (Control c in ctrl.Controls)
yield return c;
foreach (Control c in ctrl.Controls)
foreach (Control cc in FindAllControls(c))
yield return cc;
}
--------------------编程问答-------------------- --------------------编程问答-------------------- 那么久了 还没解决? 上面都解决不了?
IEnumerable<ListBox> listBoxs = this.Controls.Cast<Control>().Where(c => c.GetType() == typeof(ListBox)).Select(c=>(ListBox)c);
foreach (var v in listBoxs)
MessageBox.Show(v.Text);
补充:.NET技术 , LINQ