Я использую этот универсальный рекурсивный метод:
Предположение этого метода состоит в том, что если элемент управления равен T, то метод не выглядит в его дочерних элементах. Если вам нужно также смотреть на его детей, вы можете легко изменить его соответственно.
public static IList<T> GetAllControlsRecusrvive<T>(Control control) where T :Control
{
var rtn = new List<T>();
foreach (Control item in control.Controls)
{
var ctr = item as T;
if (ctr!=null)
{
rtn.Add(ctr);
}
else
{
rtn.AddRange(GetAllControlsRecusrvive<T>(item));
}
}
return rtn;
}