【问题标题】:How can I get all Labels on a form and set the Text property of those with a particular name pattern to string.empty?如何获取表单上的所有标签并将具有特定名称模式的标签的 Text 属性设置为 string.empty?
【发布时间】:2012-10-09 21:49:47
【问题描述】:

我想清除控件为标签且名称以“标签”开头的表单上的所有值

这段代码:

List<Label> lbls = this.Controls.OfType<Label>().ToList();
foreach (var lbl in lbls)
{
    if (lbl.Name.StartsWith("label"))
    {
        lbl.Text = string.Empty;
    }
}

...不起作用,因为 lambda 什么也没找到 - lbls.Count = 0。

这不会得到表单上的所有控件,即使是其他控件的子控件(例如,在我的例子中,面板)?

【问题讨论】:

  • 不,它只在父容器中找到控件。但我假设你知道你想找到什么。因此,您只需指定要搜索的容器。您可以使用Concat 添加所有标签。
  • 我认为这不会递归搜索所有容器
  • 不,this.Controls 只包含第一级控件。直接托管在表单表面上的那些。

标签: c# winforms generics dynamic lambda


【解决方案1】:

尝试使用这种方法:

public void ClearLabel(Control control)
{
   if (control is Label)
   {
       Label lbl = (Label)control;
       if (lbl.Text.StartsWith("label"))
           lbl.Text = String.Empty;

   }
   else
       foreach (Control child in control.Controls)
       {
           ClearLabel(child);
       }

}

您只需要将表单传递给 ClearLabel 方法。

【讨论】:

  • 我不得不将 lbl.Text.StartsWith() 更改为 lbl.Name.StartsWith(),但足够接近。
【解决方案2】:

不,它不会递归搜索面板。

做你想做的,你可以做:

void changeLabel(Control c)
{
    if (lbl.Name.StartsWith("label"))
    {
        lbl.Text = string.Empty;
    }

    foreach(Control _c in c.Controls)
        changeLabel(_c);
}

【讨论】:

    【解决方案3】:

    这不涉及前面答案中提到的递归问题;这只是另一种表达你所拥有的更简洁的方式:

    var labels = Controls.OfType<Label>().Where( x => x.Name.StartsWith("label") );
    foreach (var label in labels)
    {
        label.Text = "";
    }
    

    这就是我最终写的,我想在这里添加它只是为了完整性 - 基本上,你不需要ToList()和String.Empty hasn't had any advantage over "" for ages.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-10
      • 2020-05-02
      • 1970-01-01
      • 1970-01-01
      • 2016-11-14
      • 2021-08-14
      • 2012-01-31
      相关资源
      最近更新 更多