У C # (оскільки ви позначили його як такий), ви можете використовувати вираз LINQ таким чином:
List<Control> c = Controls.OfType<TextBox>().Cast<Control>().ToList();
Редагування для рекурсії:
У цьому прикладі ви спочатку створюєте список елементів керування, а потім викликаєте метод його заповнення. Оскільки метод є рекурсивним, він не повертає список, а лише оновлює його.
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);
}
}
Це можливо можливо зробити в одному операторі LINQ за допомогою Descendants
функції, хоча я не так знайомий з нею. Дивіться цю сторінку для отримання додаткової інформації про це.
Змініть 2, щоб повернути колекцію:
Як @ProfK запропонував, метод, який просто повертає потрібні елементи управління, ймовірно, є кращою практикою. Щоб проілюструвати це, я змінив код наступним чином:
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;
}