Enumerable.OfType
не выполняет поиск элементов управления в иерархии элементов управления.Поэтому, если вы хотите найти элементы управления рекурсивно, вы можете использовать этот метод расширения:
public static IEnumerable<T> RecursiveControlsOfType<T>(this Control rootControl) where T : Control
{
foreach (Control child in rootControl.Controls)
{
if (child is T targetControl)
yield return targetControl;
foreach (T targetControlChild in child.RecursiveControlsOfType<T>())
yield return targetControlChild;
}
}
Использование:
Button[] nonRecursiveButtons = this.Controls.OfType<Button>().ToArray();
Button[] recursiveButtons = this.RecursiveControlsOfType<Button>().ToArray();