在使用菜单条和多个面板容器的Windows应用程序中,根据菜单选项
显示一个面板通过手动传递名称隐藏所有面板非常耗时,有没有办法隐藏所有面板或以任何方式获取表单中所有面板的名称?
答案 0 :(得分:8)
foreach (Control c in this.Controls)
{
if (c is Panel) c.Visible = false;
}
你甚至可以进行递归,并传递ControlCollection
而不是使用this.Controls
:
HidePanels(this.Controls);
...
private void HidePanels(ControlCollection controls)
{
foreach (Control c in controls)
{
if (c is Panel)
{
c.Visible = false;
}
// hide any panels this control may have
HidePanels(c.Controls);
}
}
答案 1 :(得分:5)
因此,您可能希望获得表单上任何位置的所有控件,而不仅仅是顶级控件。为此,我们需要这个方便的小助手函数来获取所有级别的所有子控件以用于特定控件:
public static IEnumerable<Control> GetAllControls(Control control)
{
Stack<Control> stack = new Stack<Control>();
stack.Push(control);
while (stack.Any())
{
var next = stack.Pop();
yield return next;
foreach (Control child in next.Controls)
{
stack.Push(child);
}
}
}
(如果你认为你已经足够使用它,请随意将它作为一种扩展方法。)
然后我们可以在该结果上使用OfType
来获取特定类型的控件:
var panels = GetAllControls(this).OfType<Panel>();
答案 2 :(得分:3)
干净就可以写出像这样的东西
foreach (Panel p in this.Controls.OfType<Panel>()) {
p.Visible = false;
}
答案 3 :(得分:1)
哎呀!我也只是编写代码! :P
Control[] aryControls = new Control[]{ controlnamehere1, controlnamehere2 };
foreach (Control ctrl in aryControls)
{
ctrl.Hide();
}
或者,或者:
Control[] aryControls = new Control[]{ controlnamehere1, controlnamehere1 };
foreach (Control ctrl in aryControls)
{
ctrl.Visible = false;
}