Я использую рекурсивный подход к этой проблеме. Смотрите ниже метод, который я обычно использую.
private void GetControls<T>(Control ctrl, List<T> result)
{
foreach (Control con in ctrl.Controls.OfType<Control>().Where(c => c.Controls.Count > 0))
GetControls<T>(con, result);
foreach (T control in ctrl.Controls.OfType<T>())
result.Add(control);
}
Вы можете назвать это так:
List<BaseUserControl> baseUserControls = new List<BaseUserControl>();
GetControls<BaseUserControl>(Page.Controls, out baseUserControl);
После этого список заполняется ссылками на ваши BaseUserControls. Рекурсивный подход необходим, потому что Page.Controls
не содержит все элементы управления на вашей странице. Некоторые элементы управления на вашей странице являются дочерними элементами для элемента управления, который находится в этой коллекции (или даже дочерними элементами для них), и, следовательно, являются вложенными уровнями глубже. Отсюда рекурсивный подход.