2011-08-24 17 views
5

Attualmente ho disabilitato la maggior parte dei controlli del mio modulo all'avvio perché non è possibile utilizzarli finché non viene caricato un file. Tuttavia, una volta caricato il file, i controlli dovrebbero essere abilitati.Come abilitare TUTTI i controlli su un modulo?

Stavo usando le associazioni ma non penso che siano una buona soluzione. Per uno, è una complessità inutile. In secondo luogo, non è possibile utilizzare i collegamenti per tutto. Ad esempio, gli elementi MenuStrip non possono avere la loro proprietà Enabled associata alla proprietà fileLoaded. Solo l'intero menu può e non voglio disabilitare l'intero menu all'avvio, solo alcune operazioni di menu che operano sul file.

Sto davvero cercando un modo per abilitare TUTTO. La maggior parte quando gli viene chiesto che avrebbe risposto con questo:

foreach (Control c in Controls) 
{ 
    c.Enabled = true; 
} 

Tuttavia, che non funziona per l'abilitazione articoli MenuStrip o controlli all'interno di altri controlli (come un controllo Panel o personalizzato). Pertanto non abiliterebbe le barre di scorrimento all'interno dei contenitori.

Suppongo che potrei usare quella linea e abilitare manualmente tutto il resto, ma avrei potuto sempre solo abilitato tutto abilitato. Sto cercando un modo per abilitare automaticamente tutto.

+0

Come sono stati gli elementi disabilitati, in primo luogo? Forse puoi tenere traccia di ciò che è stato disabilitato in una lista e quindi riabilitare tutti gli elementi da quella lista (e cancellarla). –

+0

Sono disabilitati nella finestra di progettazione del modulo. La maggior parte degli strumenti dell'applicazione non può essere utilizzata senza un file caricato, pertanto sono disabilitati per impostazione predefinita. –

risposta

11

ricorsione

private void enableControls(Control.ControlCollection Controls) 
{ 
    foreach (Control c in Controls) 
    { 
     c.Enabled = true; 
     if (c is MenuStrip) 
     { 
      foreach(var item in ((MenuStrip)c).Items) 
      { 
       item.Enabled = true; 
      } 
     } 
     if (c.ControlCollection.Count > 0) 
      enableControls(c.Controls); 

    } 
} 

Modifica

Avrebbe dovuto essere il controllo contare la Collezione di controllo, invece di HasControls Che è WebControls

+0

Grazie, questo funziona bene. Tuttavia, continua a non abilitare gli elementi MenuStrip. Suppongo che potrei abilitarli manualmente ma mi chiedo se c'è un modo per includerli con questo ciclo? –

+0

sì, potremmo farlo – msarchet

+0

@JohnSmith controlla la modifica per menustrip – msarchet

2

Fate questo:

var Enable = (Control c) => 
      { 
       c.Enabled = true; 
       if(c.Controls != null) 
        foreach(Control c2 in c.Controls) 
         Enable(c2); 
      } 

Enable(YourForm); 
+0

Questo valore scende solo 1 livello – msarchet

+0

@msarchet: no, il suo ricorsivo – Dani

+0

ha perso la chiamata e lo ha letto come c2.enable – msarchet

1

ricorsivamente iterare suil menu è necessario per disabilitare ogni elemento nei menu. Tuttavia, esiste una soluzione più semplice per tutti i controlli del modulo: incorporarli in un pannello che si estende su tutto il modulo e disattivare il modulo in VS Designer. Quando il tuo utente seleziona un file, attiva il pannello e viola! Non è necessaria alcuna ricorsione extra (o overhead).

Se si vuole ancora andare via ricorsiva, vorrei cambiare il metodo Attiva dal primo rinominandolo a ChangeEnabledState e, in secondo luogo, vorrei un parametro un bool che permetterebbe di utilizzare per assegnare alla proprietà Enabled. In questo modo è possibile abilitare/disabilitare i controlli secondo necessità. Ricordare, tuttavia, che è necessario aggiungere un controllo per verificare se il controllo è il pulsante (o quale controllo si sta utilizzando per aprire OpenFileDialog) in un'operazione di disabilitazione.

6

Mettere tutti i controlli in un pannello;

panel.enable = falso -> tutti i controlli nel pannello saranno disabilitati panel.enable = true -> tutti i controlli nel pannello saranno abilitati (se sono abilitati per impostazione predefinita, riempiranno brevemente il pannello con i controlli abilitati , lascia il pannello disattivato in modo che anche i tuoi controlli siano disabilitati. Dopo il pannello di abilitazione, i controlli saranno abilitati)

+0

+1, è quello che vorrei fare. – TheBlastOne

3

Per gli articoli di menustrip puoi farlo in modo ricorsivo, è molto semplice. Basta impostare il flag item.Enabled su true o false.

È possibile utilizzare la mia classe, è solo un codice di poche righe, facile da usare. Puoi anche creare una funzione di ricerca e solo passare il nome che vuoi disabilitare. Enjoy:

namespace Test_MenuItemIteration 
{ 
    using System.Collections.Generic; 
    using System.Windows.Forms; 

    public static class GetAllMenuStripItems 
    { 
     #region Methods 

     /// <summary> 
     /// Gets a list of all ToolStripMenuItems 
     /// </summary> 
     /// <param name="menuStrip">The menu strip control</param> 
     /// <returns>List of all ToolStripMenuItems</returns> 
     public static List<ToolStripMenuItem> GetItems(MenuStrip menuStrip) 
     { 
      List<ToolStripMenuItem> myItems = new List<ToolStripMenuItem>(); 
      foreach (ToolStripMenuItem i in menuStrip.Items) 
      { 
       GetMenuItems(i, myItems); 
      } 
      return myItems; 
     } 

     /// <summary> 
     /// Gets the menu items. 
     /// </summary> 
     /// <param name="item">The item.</param> 
     /// <param name="items">The items.</param> 
     private static void GetMenuItems(ToolStripMenuItem item, List<ToolStripMenuItem> items) 
     { 
      items.Add(item); 
      foreach (ToolStripItem i in item.DropDownItems) 
      { 
       if (i is ToolStripMenuItem) 
       { 
        GetMenuItems((ToolStripMenuItem)i, items); 
       } 
      } 
     } 

     #endregion Methods 
    } 
} 

utilizzare per le app:

List<ToolStripMenuItem> myItems = GetAllMenuStripItems.GetItems(this.menuStrip1); 
foreach (var item in myItems) 
{ 
    MessageBox.Show(item.Text); 
    item.Enabled = false; 
} 
Problemi correlati