En C# (puisque vous l'avez marqué comme tel), vous pourriez utiliser une expression LINQ comme celle-ci :
List<Control> c = Controls.OfType<TextBox>().Cast<Control>().ToList();
Modifier pour la récursion :
Dans cet exemple, vous créez d'abord la liste de contrôles, puis vous appelez une méthode pour la remplir. Comme la méthode est récursive, elle ne renvoie pas la liste, elle la met simplement à jour.
List<Control> ControlList = new List<Control>();
private void GetAllControls(Control container)
{
foreach (Control c in container.Controls)
{
GetAllControls(c);
if (c is TextBox) ControlList.Add(c);
}
}
Il peut être possible de faire cela dans une seule déclaration LINQ en utilisant la fonction Descendants
bien que je ne sois pas aussi familier avec cette fonction. Voir cette page pour plus d'informations à ce sujet.
Editer 2 pour retourner une collection :
Comme l'a suggéré @ProfK, une méthode qui renvoie simplement les contrôles souhaités est probablement une meilleure pratique. Pour illustrer cela, j'ai modifié le code comme suit :
private IEnumerable<Control> GetAllTextBoxControls(Control container)
{
List<Control> controlList = new List<Control>();
foreach (Control c in container.Controls)
{
controlList.AddRange(GetAllTextBoxControls(c));
if (c is TextBox)
controlList.Add(c);
}
return controlList;
}
1 votes
Question connexe : stackoverflow.com/questions/253937/
0 votes
J'ai fait un Proposition d'API : Ajouter la propriété Descendants pour le contrôle sur github.com/dotnet/winforms pour cela. Si vous l'aimez, merci de l'upvoter.