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