当前位置:编程学习 > C#/ASP.NET >>

linq 查找页面某一类型控件

如何用linq查找页面某一类型的控件,以前看到过,很简洁。 --------------------编程问答-------------------- http://brendan.enrick.com/post/Fun-With-Web-Forms-Controls-and-LINQ.aspx


http://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)
{
    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;
}
--------------------编程问答-------------------- 当然,你要理解有关扩展方法的概念,也要知道Linq,还要知道asp.net控件的嵌套层次概念,还要知道树的遍历的概念。最后,要知道为什么应该使用FindControl而不是这类遍历方法,还要知道FindControl到底是怎么查询的(不是这样查询的)。 --------------------编程问答-------------------- mark  --------------------编程问答--------------------

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
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,