6

メニュー ストリップと複数のパネル コンテナーを使用する Windows アプリケーションでは、メニュー オプションに応じてパネルが表示されます。

手動で名前を渡してすべてのパネルを非表示にするのは非常に時間がかかります.すべてのパネルを非表示にする方法や、フォーム内のすべてのパネルの名前を取得する方法はありますか??

4

4 に答える 4

10
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);
    }
}
于 2013-06-06T19:40:22.903 に答える
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>();
于 2013-06-06T19:46:14.723 に答える
3

このようなものを書くのはきれいです

foreach (Panel p in this.Controls.OfType<Panel>()) {
    p.Visible = false;
}
于 2013-06-06T19:41:40.337 に答える
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;
}
于 2013-06-06T19:42:13.460 に答える