メニュー ストリップと複数のパネル コンテナーを使用する 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;
}