2012-11-19 12 views
9

Il mio modulo ha centinaia di controlli: menu, pannelli, splitter, etichette, caselle di testo, il nome.Come disabilitare tutti i controlli del modulo ad eccezione di un pulsante?

C'è un modo per disattivare ogni controllo tranne un singolo pulsante?

Il motivo per cui il pulsante è significativo è perché non è possibile utilizzare un metodo che disabilita la finestra o qualcosa del genere perché un controllo deve essere ancora utilizzabile.

+1

Se si inserisce il pulsante in un modulo separato? – SLaks

+0

Non è possibile eseguire il ciclo di tutti i controlli del modulo, impostando la proprietà Abilitato su ciascuno? Nel tuo ciclo, ignora il pulsante usando il suo ID/nome. Oppure, vai avanti e disabilita tutto nel ciclo, quindi subito dopo attiva il pulsante. –

risposta

21

È possibile effettuare una chiamata ricorsiva per disabilitare tutti i controlli coinvolti. Quindi devi abilitare il tuo pulsante e qualsiasi contenitore genitore.

private void Form1_Load(object sender, EventArgs e) { 
     DisableControls(this); 
     EnableControls(Button1); 
    } 

    private void DisableControls(Control con) { 
     foreach (Control c in con.Controls) { 
      DisableControls(c); 
     } 
     con.Enabled = false; 
    } 

    private void EnableControls(Control con) { 
     if (con != null) { 
      con.Enabled = true; 
      EnableControls(con.Parent); 
     } 
    } 
+1

Perché dovresti includere la parola chiave ref lì? –

+0

Non lo farei. Ero al telefono mentre lo scrivevo e per qualche ragione è appena uscito – pinkfloydx33

+0

Ha. Molto bene. Mi piace come hai reso i metodi non conosci o ti preoccupi di controlli specifici. I neofiti trascurano cose del genere. –

8

Per una migliore, soluzione più elegante, che sarebbe facile da mantenere - probabilmente è necessario riconsiderare il vostro disegno, come ad esempio mettere da parte il pulsante da altri controlli. Quindi, supponendo che altri controlli si trovino in un pannello o in un gruppo, è sufficiente eseguire Panel.Enabled = False.

Se davvero si vuole mantenere il vostro disegno corrente, è possibile Linearise ControlCollection tree into array of Control per evitare la ricorsione e quindi effettuare le seguenti operazioni:

Array.ForEach(Me.Controls.GetAllControlsOfType(Of Control), Sub(x As Control) x.Enabled = False) 
yourButton.Enabled = True 
+1

+1 per aver menzionato la riconsiderazione del progetto. –

+0

+1 per 'Panel.Enabled = false | true'. Ridisegnare la tua interfaccia per creare un gruppo di controlli e quindi disabilitare l'intero gruppo è sicuramente un modo migliore per progettare l'interfaccia utente. – sentenza

10

Sulla base di @ pinkfloydx33 risposta e la modifica che ho fatto su di esso, ho creato un'estensione metodo che rende ancora più facile, basta creare una public static class come questo:

public static class GuiExtensionMethods 
{ 
     public static void Enable(this Control con, bool enable) 
     { 
      if (con != null) 
      { 
       foreach (Control c in con.Controls) 
       { 
        c.Enable(enable); 
       } 

       try 
       { 
        con.Invoke((MethodInvoker)(() => con.Enabled = enable)); 
       } 
       catch 
       { 
       } 
      } 
     } 
} 

Ora, per attivare o disattivare un controllo, forma, menu, subcontrols, ecc basta fare:

this.Enable(true); //Will enable all the controls and sub controls for this form 
this.Enable(false);//Will disable all the controls and sub controls for this form 

Button1.Enable(true); //Will enable only the Button1 

Allora, cosa avrei fatto, simile a quella di @ pinkfloydx33 risposta:

private void Form1_Load(object sender, EventArgs e) 
{ 
     this.Enable(false); 
     Button1.Enable(true); 
} 

Mi piace metodi di estensione, perché sono statici e si può usare ovunque senza creare istanze (manualmente), ed è molto più chiara almeno per me.

+0

Questo non funziona. Se si chiama this.Enable (false); quindi chiama Button1.Enable (true), quindi questo (il modulo) e qualsiasi altro controllo padre di Button1 sono ancora disabilitati. –

+0

Probabilmente non ti capisco, ma penso che fosse questo il punto. Provare ad abilitare il genitore di Button1 se questo è ciò che si richiede, dovrebbe abilitare il genitore e tutti i suoi controlli figli. – coloboxp

Problemi correlati