5

In meiner Windows-Anwendung, die Menüleiste und mehrere Panel-Container verwendet, wird je nach Menüoptionwie alle Panels in Windows-Form ausblenden?

Alle Panels durch manuelle Übergabe von Namen zu verbergen ist sehr zeitaufwendig, gibt es eine Möglichkeit, alle Panels oder einen Weg zu verbergen um Namen aller Panels in einer Form zu bekommen ??

+0

ich habe Ihren Titel bearbeitet. Bitte lesen Sie "[Sollten die Fragen" Tags "in ihren Titeln enthalten?] (Http://meta.stackexchange.com/questions/19190/)", wobei der Konsens "nein, sie sollten nicht" lautet. –

+0

Haben Sie eine [foreach] (http://msdn.microsoft.com/en-us/library/ttw7t8t6 (v = vs.80) .aspx) Schleife untersucht? – Brian

Antwort

8
foreach (Control c in this.Controls) 
{ 
    if (c is Panel) c.Visible = false; 
} 

Und man könnte sogar, dass rekursiv machen, und übergeben im ControlCollection statt this.Controls der Verwendung:

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

Ninja'ed. Ich habe gerade diesen Code geschrieben. So, jetzt hast du meine Aufzählung. – Renan

+0

@Renan, danke viel Freund! –

+0

+1 für mich zu schlagen: P – Brian

3

Seine saubere so etwas wie dieses

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

Argh zu schreiben! Ich habe gerade den Code geschrieben! : P

Control[] aryControls = new Control[]{ controlnamehere1, controlnamehere2 }; 
foreach (Control ctrl in aryControls) 
{ 
    ctrl.Hide(); 
} 

Oder alternativ:

Control[] aryControls = new Control[]{ controlnamehere1, controlnamehere1 }; 
foreach (Control ctrl in aryControls) 
{ 
    ctrl.Visible = false; 
} 
+0

Woher wissen Sie, dass das Steuerelement panel1, button1 enthält? Warum erschaffst du ein neues Control [] - Array, dessen Speicher unwirksam ist, versuchst du schlechte Gewohnheiten zu lernen - um unnötig Speicher zu verschwenden? –

+0

Bearbeitet, um klarer zu sein. Siehst du jetzt nur meine Antworten, um snarky zu sein? – Brian

5

So vermutlich wollen Sie alle Steuerelemente überall auf dem Formular erhalten, nicht nur Top-Level-Kontrollen. Dafür werden wir diese handliche kleine Hilfsfunktion müssen alle untergeordneten Steuerelemente zu bekommen, auf allen Ebenen, für eine bestimmte Steuerung:

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

(Fühlen Sie sich frei eine Erweiterungsmethode zu machen, wenn Sie denken, dass Sie es verwenden würde, genug)

Dann können wir nur OfType auf diesem Ergebnis verwenden Sie die Steuerelemente eines bestimmten Typs zu erhalten.

var panels = GetAllControls(this).OfType<Panel>(); 
+0

Schöne Möglichkeit, eine Schleife anstelle von Rekursion zu verwenden (wodurch ein potenzieller Stack-Überlauf vermieden wird, obwohl Sie, wenn Sie es geschafft haben, eine Kontrollhierarchie zu haben, wahrscheinlich einen Schritt zurückgehen und eine Pause einlegen sollten ...)! Ich denke, es könnte ein kleines bisschen besser sein, wenn Sie den Typ als generisch und schob nur Steuerelemente, die den angeforderten Typ auf den Stapel passte. Vielleicht ist es aber nicht nötig, hrm .... – Joshua

+0

@Joshua Das würde nicht funktionieren. Was ist, wenn ein Benutzersteuerelement auf der obersten Ebene mit einem Bereich darin vorhanden ist? Willst du das Panel oder nicht? Wenn Sie dies tun, können Sie die gewünschten Bereiche nicht sofort ausfiltern. Sie müssen dies am Ende tun.Natürlich, wenn Sie das Steuerelement nicht zurückgeben wollen, es sei denn, es und alle seine Eltern sind * alle * des angegebenen Typs, dann ist das eine andere Geschichte. Das wäre sicherlich schneller (Sie sehen viel weniger Kontrollen durch), aber es ist auch sehr unterschiedlich in Bezug auf die Ergebnisse. – Servy

+0

@Joshua Beachten Sie auch, dass die Vermeidung von Rekursion nicht nur mögliche SO-Ausnahmen verhindert, sondern auch generell leistungsfähiger ist. Nicht um eine * riesige * Marge, aber zu einem gewissen Grad. Es verhindert auch die unordentlichen Stapelspuren beim Debuggen oder Behandeln von Ausnahmen. – Servy