J'ai un formulaire qui a beaucoup de cases à cocher générées dynamiquement. Au moment de l'exécution, comment puis-je parcourir chacun d'eux afin d'obtenir leur valeur et leurs ID?
foreach(Control c in this.Controls)
{
if(c is CheckBox)
{
// Do stuff here ;]
}
}
J'utilise une méthode d'extension simple qui fonctionnera pour tout type de contrôle:
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;
}
}
}
Ensuite, vous pouvez l'utiliser comme ceci:
var checkboxes = control.AllControls<CheckBox>();
L'utilisation de IEnumerable vous permet de choisir le mode de stockage des résultats, mais également d'utiliser linq:
var checkedBoxes = control.AllControls<CheckBox>().Where(c => c.Checked);
Si c'est Windows Forms , vous pouvez essayer quelque chose comme ceci:
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);
}
}
N'oubliez pas que les contrôles de conteneur peuvent contenir des enfants, vous pouvez donc également les vérifier.
Comme ceci, peut-être (si c'est dans Windows Forms ):
foreach(var checkBox in myForm.Controls.OfType<CheckBox>())
{
//Do something.
}
Lorsqu'elles sont créées, obtenez une liste de références aux valeurs, puis vous pouvez parcourir la liste.
Je sais que c'est vieux, mais c'était facile comme je peux l'imaginer.
Ajoutez simplement toutes les cases à cocher dans un List<Checkbox>
; toutes les cases des cases à cocher sont dans la liste et même si elles changent dans l'interface utilisateur de la liste, elles aussi.
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
}
J'espère que cela t'aides :)
myForm.Controls.OfType<CheckBox>().ToList().ForEach(c => c...);
dans le cas où les cases à cocher sont à l'intérieur de GroupBox ou Panel, utilisez ses noms au lieu de 'myForm'