C# 如何获取表单上的所有标签,并将具有特定名称模式的标签的文本属性设置为string.empty?

C# 如何获取表单上的所有标签,并将具有特定名称模式的标签的文本属性设置为string.empty?,c#,winforms,generics,dynamic,lambda,C#,Winforms,Generics,Dynamic,Lambda,我想清除控件是标签且其名称以“label”开头的窗体上的所有值 此代码: List<Label> lbls = this.Controls.OfType<Label>().ToList(); foreach (var lbl in lbls) { if (lbl.Name.StartsWith("label")) { lbl.Text = string.Empty; } } List lbls=this.Controls.OfTy

我想清除控件是标签且其名称以“label”开头的窗体上的所有值

此代码:

List<Label> lbls = this.Controls.OfType<Label>().ToList();
foreach (var lbl in lbls)
{
    if (lbl.Name.StartsWith("label"))
    {
        lbl.Text = string.Empty;
    }
}
List lbls=this.Controls.OfType().ToList();
foreach(lbl中的变量lbl)
{
if(lbl.Name.StartsWith(“标签”))
{
lbl.Text=string.Empty;
}
}
…不起作用,因为lambda找不到任何东西-lbls.Count=0


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

不,它不会递归搜索面板

要想做你想做的事,你可以做:

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

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

尝试使用以下方法:

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方法。

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

var labels = Controls.OfType<Label>().Where( x => x.Name.StartsWith("label") );
foreach (var label in labels)
{
    label.Text = "";
}
var labels=Controls.OfType()。其中(x=>x.Name.StartsWith(“label”);
foreach(标签中的变量标签)
{
label.Text=“”;
}

这就是我最后写的,我想在这里添加它只是为了完整性-基本上,您不需要
ToList()
,而且不,它只在父容器中找到控件。但我想你知道你想找到什么。因此,您只需指定要搜索的容器。您可以使用
Concat
添加所有标签。我认为这不会递归搜索所有容器。不,这。控件只包含第一级控件。我必须将lbl.Text.StartsWith()更改为lbl.Name.StartsWith(),但距离足够近。