5

W mojej aplikacji Windows, która korzysta z paska menu i wielu kontenerów paneli, wyświetlany jest panel w zależności od opcji menu:jak ukryć wszystkie panele w formie okna?

ukrywanie wszystkich paneli przez ręczne podawanie nazw jest bardzo czasochłonne, czy istnieje sposób na ukrycie wszystkich paneli lub w jakikolwiek sposób aby uzyskać nazwy wszystkich paneli w formularzu?

+0

mam edytowany tytuł. Zobacz, "[Czy w tytułach pytania powinny znaleźć się" znaczniki "?] (Http://meta.stackexchange.com/questions/19190/)", gdzie konsensus brzmi "nie, nie powinien". –

+0

Czy analizowałeś za pomocą pętli [foreach] (http://msdn.microsoft.com/en-us/library/ttw7t8t6 (v = vs.80) .aspx)? – Brian

Odpowiedz

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

I można nawet dokonać tego rekurencyjnych i przekazać w ControlCollection zamiast korzystania 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); 
    } 
} 
+0

Ninja'ed. Właśnie pisałem ten kod. Więc teraz masz mój pomysł. – Renan

+0

@Renan, wielkie dzięki! –

+0

+1 za pokonanie uderzenia: P – Brian

3

Jest czysty napisać coś takiego

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

Argh! Właśnie pisałem kod! : P

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

Lub alternatywnie:

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

Skąd wiadomo, że kontrolka zawiera panel1, przycisk1? dlaczego tworzysz nową tablicę kontrolną [], jej pamięć jest nieefektywna, czy próbujesz nauczyć się złych nawyków - niepotrzebnie marnować pamięć? –

+0

Edytowany w celu uzyskania większej przejrzystości. Czy teraz patrzysz na moje odpowiedzi, aby być snarky? – Brian

5

więc przypuszczalnie chcesz uzyskać wszelkie kontrole, w dowolnym miejscu na formie, a nie tylko do góry Kontrola poziomu. W tym celu musimy to poręczną funkcję małego pomocnika, aby uzyskać wszystkie formantów podrzędnych, na wszystkich poziomach, dla konkretnej kontroli:

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

(Zapraszam do sprawiają, że metodę rozszerzenia, jeśli myślisz, że możesz go używać wystarczy)

Wtedy możemy po prostu użyć OfType tego wyniku, aby uzyskać kontrole danego typu.

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

Dobry sposób na użycie pętli zamiast rekursji (dzięki temu unikniesz potencjalnego przepełnienia stosu, ale jeśli udało ci się uzyskać głęboką hierarchię kontroli, powinieneś cofnąć się i odetchnąć ...)! Myślę, że może być trochę lepiej, jeśli wziąłeś typ jako rodzajowy i tylko popchnąłeś kontrolki, które pasowały do ​​żądanego typu do stosu. Może to nie jest potrzebne, hmm .... – Joshua

+0

@ Joshua Które nie zadziała. Co się dzieje, jeśli na najwyższym poziomie znajduje się panel użytkownika z panelem w nim. Czy chcesz ten panel, czy nie? Jeśli to zrobisz, nie możesz odfiltrować paneli, których szukasz od razu, musisz to zrobić na końcu.Oczywiście, jeśli nie chcesz zwrócić kontroli, chyba że ona i wszyscy jej rodzice są * wszyscy * określonego typu, to jest inna historia. Byłoby to z pewnością szybsze (wyglądasz o wiele mniej kontroli), ale jest również bardzo różne pod względem wyników. – Servy

+0

@Joshua Należy również pamiętać, że unikanie rekursji nie tylko zapobiega wszelkim możliwym wyjątkom SO, ale jest również ogólnie bardziej wydajne. Nie przez * ogromny * margines, ale do pewnego stopnia. Zapobiega również śladom stosu niechlujnego podczas debugowania wyjątków lub radzenia sobie z nimi. – Servy