Одна техника, которую я видел, состоит в создании метода расширения для ControlCollection, который возвращает IEnumerable ... что-то вроде этого:
public static IEnumerable<Control> FindAll(this ControlCollection collection)
{
foreach (Control item in collection)
{
yield return item;
if (item.HasControls())
{
foreach (var subItem in item.Controls.FindAll())
{
yield return subItem;
}
}
}
}
, который обрабатывает рекурсию.Затем вы можете использовать его на своей странице следующим образом:
var textboxes = this.Controls.FindAll().OfType<TextBox>();
, что даст вам все текстовые поля на странице.Вы можете пойти еще дальше и создать общую версию вашего метода расширения, который обрабатывает фильтрацию типов.Это может выглядеть так:
public static IEnumerable<T> FindAll<T>(this ControlCollection collection) where T: Control
{
return collection.FindAll().OfType<T>();
}
, и вы можете использовать это так:
var textboxes = this.Controls.FindAll<TextBox>().Where(t=>t.Visible);