如何在多个面板中隐藏控件?

How to hide controls in several panels?

我试图隐藏面板中的所有标签(而不是整个面板)。 对于标签只是 label1、label2.. 的情况,我会这样做(尽管如果您知道更简单的方法,请告诉我):

for(int i=0; i<3; i++){
   Panel p = this.Controls["panel"+i] as Panel;

   for(int j=0; j<9; i++){
      if(p.Controls["label"+j]!=null) p.Controls["label"+j].Visible=false;
   }
}

所以如果我的标签是 lbObj、LbInt4.. 我该如何遍历所有标签并隐藏它们?我试过:

foreach(Panel p in Controls) 
    foreach(Label l in p) l.Visible=false;

但这似乎不起作用。

试试这个:

foreach (Panel p in this.Controls)

foreach(Label l in p.Controls) l.Visible=false;

第一个 way:using 2 个 foreach 循环

foreach (Panel panel in Controls.OfType<Panel>())
{
   foreach (var label in panel.Controls.OfType<Label>())
   {
        label.Visible = false;
   }
}

第二个 way:using LINQ

foreach (var label in Controls.OfType<Panel>().SelectMany(panel =>panel.Controls.OfType<Label>()))
{
    label.Visible = false;
}

您的问题是您正在查看面板内部,但您应该在该面板内部查找控件,并且

Controls.OfType<Panel>() 

就是你需要的。

编辑:寻找特定标签

foreach (Panel panel in Controls.OfType<Panel>())
{
     foreach (var label in panel.Controls.OfType<Label>())
     {
         if (label.Text.Contains("label")) // or any other condition that you want to perform
         {
             label.Visible = false;
         }
     }
}

与 LINQ 相同(有点复杂且可读性差):

foreach (var label in Controls.OfType<Panel>().SelectMany(panel => panel.Controls.OfType<Label>().Where(label => label.Text.Contains("label"))))
{
    label.Visible = false;
}

要使用 LINQ 方法,您需要添加:

using System.Linq;

命名空间。

尝试在您的控件集合上使用 OfType<T> 过滤器来获取您想要的类型,然后采取相应的行动:

foreach (Panel p in this.Controls.OfType<Panel>()) {
  foreach (Label l in p.Controls.OfType<Label>()) {
    l.Visible = false;
  }
}

此代码假定您在其他面板内没有更多面板等。