如何隐藏Windows窗体中的所有面板

本文关键字:窗体 Windows 何隐藏 隐藏 | 更新日期: 2023-09-27 18:17:28

在我使用菜单条和多个面板容器的windows应用程序中,根据菜单选项显示一个面板

通过手动传递名称来隐藏所有面板是非常耗时的,是否有任何方法可以隐藏所有面板或任何方法可以在表单中获取所有面板的名称?

如何隐藏Windows窗体中的所有面板

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);
    }
}

所以你可能想要得到所有的控件在窗体的任何地方,而不仅仅是顶层的控件。为此,我们需要这个方便的小辅助函数来获取特定控件在所有级别上的所有子控件:

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>();

这样写很简洁

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

啊哈!我刚刚也在写代码!: 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;
}