Come è possibile scorrere tutte le caselle di controllo in un form?

Ho un form che ha molti generato dinamicamente le caselle di controllo. In fase di runtime, come posso scorrere ciascuno di essi in modo da poter ottenere il loro valore e Id?

  • Stai parlando di Windows Form o ASP.NET?
InformationsquelleAutor NinjaCat | 2009-11-24

 

7 Replies
  1. 37
    foreach(Control c in this.Controls)
    {
       if(c is CheckBox)
       {
       //Do stuff here ;]
       }
    }
    • Non funziona se i controlli sono incorporati all’interno di altri controlli. “questo” non è tutto.
    • Sì @Fernando68 si dovrebbe creare un ricorrente funzione che passa per tutti i ‘bambini’. Questa è una risposta da quasi 8 anni fa 😀
    • Sì, non funziona
    • questa risposta è quasi 9 anni 🙂
    • Ciao, lo so, ma ho trovato la soluzione.
    • Fantastico!!!

  2. 18

    Io uso una semplice estensione del metodo che funziona per qualsiasi tipo di controllo:

      public static IEnumerable<T> AllControls<T>(this Control startingPoint) where T : Control
      {
         bool hit = startingPoint is T;
         if (hit)
         {
            yield return startingPoint as T;
         }
         foreach (var child in startingPoint.Controls.Cast<Control>())
         {
            foreach (var item in AllControls<T>(child))
            {
               yield return item;
            }
         }
      }

    Quindi, è possibile utilizzarlo in questo modo:

    var checkboxes = control.AllControls<CheckBox>();

    Utilizzando IEnumerable consente di scegliere il modo di memorizzare i risultati, e, inoltre, consente di utilizzare linq:

    var checkedBoxes = control.AllControls<CheckBox>().Where(c => c.Checked);
    • +1 possono essere nidificati, buon punto e l’utilizzo di espressioni lambda è sempre un plus )
    • Questo è probabilmente più utile di quello di Controllo.Controlli
    • +1 Per la ricerca di controlli nidificati. Questa risposta è la migliore.
    • Questo è sicuramente migliore e più elegante ansawer! Buon lavoro.
  3. 11

    Se è Windows Form, si può provare qualcosa di simile a questo:

    private void button1_Click(object sender, EventArgs e)
    {
        Dictionary<string, bool> checkBoxes = new Dictionary<string, bool>();
        LoopControls(checkBoxes, this.Controls);
    }
    
    private void LoopControls(Dictionary<string, bool> checkBoxes, Control.ControlCollection controls)
    {
        foreach (Control control in controls)
        {
            if (control is CheckBox)
                checkBoxes.Add(control.Name, ((CheckBox) control).Checked);
            if (control.Controls.Count > 0)
                LoopControls(checkBoxes, control.Controls);
        }
    }

    Ricordare che controlli contenitore può contenere i bambini, così si potrebbe desiderare di controllare le troppo.

  4. 8

    Come questo, forse, se fosse in Windows Form):

    foreach(var checkBox in myForm.Controls.OfType<CheckBox>())
    {   
       //Do something.
    }
    • Ho fatto questo per un po ‘ – fornito so che non c’è il nido in contenitori. Si potrebbe ricordare che la vostra soluzione consente anche una .Dove c=>c.Selezionata) (o altra espressione di Linq) per essere aggiunto per la conoscenza.
  5. 1

    Quando vengono creati, ottenere una lista di riferimenti a valori, e quindi è possibile scorrere l’elenco.

  6. 0

    So che questo è vecchio, ma È stato facile come posso immaginare.

    Basta aggiungere tutte le caselle di controllo in un List<Checkbox>, tutte le caselle di controllo è stato in lista e anche se hanno cambiato l’interfaccia utente nell’elenco delle modifiche.

    List<Checkbox> checkboxes = new List<Checkboxes>();
    checkboxes.Add(chk1);
    checkboxes.Add(chk2);
    //So add all checkboxes you wanna iterate
    
    foreach(Checkbox checkbox in checkboxes){
        //Do something using checkbox object
    }

    Spero che questo aiuti 🙂

  7. 0
    myForm.Controls.OfType<CheckBox>().ToList().ForEach(c => c...);

    in caso di caselle di controllo interno di Gruppo o Pannello di utilizzare il suo nome, invece di ‘myForm’

Lascia un commento