【问题标题】:ASP.NET How to retrieve a list of the empty labels on a page?ASP.NET 如何检索页面上的空标签列表?
【发布时间】:2011-03-15 17:16:55
【问题描述】:

我的页面上有一些标签(例如 Label1...Label100)。

我不想遍历所有标签来检查 Text 属性是否为 = ""(或 string.Empty,等等),所以这是我的问题 - 是否可以使用 LINQ 或 Lambda 表达式来获取所有“空”标签?

【问题讨论】:

    标签: asp.net linq lambda


    【解决方案1】:

    通过Controls属性可以找到所有的页面控件

    Page.Controls.OfType<Label>().Where(lbl => lbl.Text == "");
    

    请注意,这不是递归的;即,如果您有一个拥有自己的控件的PlaceHolder,则Page.Controls 不会返回这些控件。

    【讨论】:

    • 请注意,它只能在顶级 Controls 集合中找到它们。
    • 我喜欢这个 LINQ 东西……所有的样本都很蹩脚,但我可以咀嚼、消费和理解。
    • @ggonsalv:确实。我不知道我怎么能忍受成为 .net 程序员 pre linq/lambda
    • @David 感谢您让我们 .Net 1.1 尼安德特人感到宾至如归……对于下一个和当 wend 是常规主食。但是编译器最终不会编写一个循环,剩下的就是语法糖吗?
    • @ggonsalv:确实如此 - 它不能让你做任何你以前不能做的事情,当编译器编码循环时它非常方便我的。
    【解决方案2】:

    您可以创建一个“FindAllChildren”扩展方法,从某个父控件(可能是页面)递归查找所有控件,并让它返回一个 IEnumerable。然后使用 Linq 查询。

    public static IEnumerable<Control> FindAllChildren(this Control control) 
    {
        foreach(Control c in control.Controls) 
        {
            yield return c;
            foreach(control child in c.FindAllChildren() 
               yield return child;
        }
    }
    
    var allEmptyLabels = parent.FindAllChildren().OfType<Label>()
        .Where(l => l.Text == String.Empty);
    

    【讨论】:

      【解决方案3】:

      这是您的标签命名约定吗?

      如果是这样,这种快速而肮脏的方法可以做到:

      List<Label> labels = new List();
      for (int i = 0; i <= 100; i++)
      {
          var label = (Label)Page.FindControl("Label" + i);
          if (label.Text != string.Empty)
              labels.Add(label);
      }
      
      // use labels collection here
      

      没有 LINQ 或 Lambda,但它是您的另一个视角。

      【讨论】:

      • 是的,我第一次使用这样的循环,但我想知道其他可能性:)
      • 好吧,希望标签不是这样命名的——除非它们是自动生成的......
      • @driis:他确实在问题中说他们是这样命名的;)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 2010-12-04
      • 1970-01-01
      • 1970-01-01
      • 2014-07-18
      • 2011-03-22
      • 2021-01-14
      相关资源
      最近更新 更多