В 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;
}