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

Abh*_*arg 6 c# windows-forms-designer visual-c#-express-2010 visual-studio-2012

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

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

Mik*_*oud 9

foreach (Control c in this.Controls)
{
    if (c is Panel) c.Visible = false;
}
Run Code Online (Sandbox Code Playgroud)

你甚至可以做那个递归,然后传入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);
    }
}
Run Code Online (Sandbox Code Playgroud)


Ser*_*rvy 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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

(如果你认为你已经足够使用它,请随意将它作为一种扩展方法.)

然后我们可以使用OfType该结果来获取特定类型的控件:

var panels = GetAllControls(this).OfType<Panel>();
Run Code Online (Sandbox Code Playgroud)