问题描述
如何用linq查找页面某一类型的控件,以前看到过,很简洁。
解决方案
解决方案二:
解决方案三:
this.Controls.Cast<Control>.Where(x=>xisTextBox).ToList().ForEach(x=>MessageBox(x.Text));
解决方案四:
确实很简洁的不过一直不太习惯linq
解决方案五:
在你的一个publicstatic类中写下这个代码publicstaticIEnumerable<Control>FindAllControls(thisControlctrl){foreach(Controlcinctrl.Controls)yieldreturnc;foreach(Controlcinctrl.Controls)foreach(ControlccinFindAllControls(c))yieldreturncc;}
注意,linq是使用迭代器的,也就是它根本不会去把一堆控件先装到内存里的什么List<Control>,而是会一个一个迭代搜索。所以它占用内存资源少。比如你要在一个GridView中搜寻所有cssClass为noem的LinkButton,并且它所在的行中一定有一个Label控件或者是一个LiteralControl控件的Text值包含着namo这个单词(注意即使所搜索的控件是在用户控件等GridViewItem.FindControl方法找不到的地方),假设我们要把这些LinkButton的color统一设置为red,可以这样写:varquery=fromLinkButtonbtninthis.GridView1.FindAllControls()wherebtn.CssClass=="noem"letrow=btn.NamingContainerasDataGridItemletsubquery=fromcinrow.FindAllControls()where(cisLabel&&((Label)c).Text.Contains("namo"))||(cisLiteralControl&&((LiteralControl)c).Text.Contains("namo"))selectcwheresubquery.Any()selectbtn;foreach(varcinquery)c.ForeColor=Color.Red;
虽然linq有无以伦比的“迭代”特性,也不要滥用它。可以直接使用一条FindControl指令的地方,尽量不要去使用这个查询方法。这个查询方法是使用宽度优先搜索去自顶向下遍历所有控件,而FindControl方法是按照asp.net控件的INamingContainer范围去搜索(并且有内部优化的索引表),后者要小得多,而且快得多。通常我只是在自动化测试程序中才去这样查找控件。
解决方案六:
哦,少了一个判断,重新修改一下:publicstaticIEnumerable<Control>FindAllControls(thisControlctrl){if(ctrl==null)yieldbreak;foreach(Controlcinctrl.Controls)yieldreturnc;foreach(Controlcinctrl.Controls)foreach(ControlccinFindAllControls(c))yieldreturncc;}
解决方案七:
当然,你要理解有关扩展方法的概念,也要知道Linq,还要知道asp.net控件的嵌套层次概念,还要知道树的遍历的概念。最后,要知道为什么应该使用FindControl而不是这类遍历方法,还要知道FindControl到底是怎么查询的(不是这样查询的)。
解决方案八:
mark
解决方案九:
IEnumerable<ListBox>listBoxs=this.Controls.Cast<Control>().Where(c=>c.GetType()==typeof(ListBox)).Select(c=>(ListBox)c);foreach(varvinlistBoxs)MessageBox.Show(v.Text);
解决方案十:
该回复于2011-10-20 13:58:21被版主删除
解决方案十一:
那么久了还没解决?上面都解决不了?