5

Nell'applicazione Windows che utilizza la barra dei menu e i contenitori di più riquadri, viene visualizzato un pannello in base all'opzione di menucome nascondere tutti i pannelli in forma di finestra?

nascondere tutti i pannelli passando manualmente i nomi richiede molto tempo, esiste un modo per nascondere tutti i pannelli o in qualsiasi modo ottenere i nomi di tutti i pannelli in una forma ??

+0

ho modificato il titolo. Per favore vedi, "[Le domande dovrebbero includere" tag "nei loro titoli?] (Http://meta.stackexchange.com/questions/19190/)", dove il consenso è "no, non dovrebbero". –

+0

Hai esaminato il ciclo [foreach] (http://msdn.microsoft.com/en-us/library/ttw7t8t6 (v = vs80) .aspx)? – Brian

risposta

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

E si potrebbe anche fare che ricorsivo, e passare il ControlCollection invece di utilizzare 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. Stavo scrivendo quel codice proprio ora. Quindi ora hai il mio upvote. – Renan

+0

@ Renan, grazie mille amico! –

+0

+1 per picchiarmi al punch: P – Brian

3

È pulito di scrivere qualcosa di simile

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

Argh! Stavo solo scrivendo il codice! : P

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

O, in alternativa:

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

come fai a sapere che il controllo contiene panel1, button1? perché stai creando un nuovo array Control [], la sua memoria è inefficace, stai cercando di imparare cattive abitudini - inutilmente sprecare memoria? –

+0

Modificato per essere più chiaro. Stai solo guardando le mie risposte per essere snarky? – Brian

5

Quindi, presumibilmente si desidera ottenere tutti i controlli in qualsiasi punto del modulo, non solo controlli di livello superiore. Per questo avremo bisogno di questa funzione piccolo aiutante a portata di mano per ottenere tutti i controlli figlio, a tutti i livelli, per un particolare controllo:

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

(Sentitevi liberi di renderlo un metodo di estensione se si pensa che ci si utilizza abbastanza)

Poi possiamo semplicemente usare OfType su quel risultato per ottenere i controlli di tipo particolare:.

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

Bel modo di usare un ciclo piuttosto che una ricorsione (evitando così un potenziale overflow dello stack, anche se si è riusciti ad avere quella profondità di una gerarchia di controllo, si dovrebbe probabilmente fare un passo indietro e fare una pausa ...)! Penso che potrebbe essere un po 'meglio se si assuma il tipo di controllo generico e solo spinto che corrisponde al tipo richiesto sullo stack. Forse non è necessario però, hrm ... – Joshua

+0

@Joshua Che non avrebbe funzionato. Che cosa succede se c'è un controllo utente al livello superiore con un pannello in esso. Vuoi quel pannello o no? Se lo fai, allora non puoi filtrare i pannelli che stai cercando subito, devi farlo alla fine.Ovviamente se non si desidera restituire il controllo a meno che, e tutti i relativi genitori, siano * tutti * del tipo specificato, allora questa è una storia diversa. Sarebbe sicuramente più veloce (si osservano controlli molto meno), ma è anche molto diverso in termini di risultati. – Servy

+0

@Joshua Si noti inoltre che evitare la ricorsione non solo previene eventuali eccezioni SO, ma è anche generalmente più performante. Non con un * enorme * margine, ma in una certa misura. Impedisce inoltre le tracce disordinate dello stack durante il debug o la gestione delle eccezioni. – Servy