如何隐藏几个面板中的控件?

时间:2015-01-17 17:50:23

标签: c# winforms

我试图隐藏面板中的所有标签(而不是整个面板)。 对于标签只是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;

但这似乎不起作用。

3 个答案:

答案 0 :(得分:3)

第一种方式:使用2个foreach循环

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

第二种方式:使用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;

命名空间。

答案 1 :(得分:1)

试试这个:

  

foreach(本节中的面板p.Controls)

     
    

foreach(p.Controls中的标签l)l.Visible = false;

  

答案 2 :(得分:1)

尝试使用控件集合上的OfType<T>过滤器来获取所需类型,然后采取相应措施:

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

此代码假设您在其他面板中没有更多面板等