Возьмите проверку типа / идентификатора из рекурсии, так что просто используйте метод "дай мне все элементы управления, рекурсивно", например
public static IEnumerable<Control> GetAllControls(this Control parent)
{
foreach (Control control in parent.Controls)
{
yield return control;
foreach(Control descendant in control.GetAllControls())
{
yield return descendant;
}
}
}
Это несколько неэффективно (с точки зрения создания большого количества итераторов), но я сомневаюсь, что у вас будет очень глубокое дерево.
Вы можете написать свой оригинальный запрос как:
var checkBoxes = this.GetAllControls()
.OfType<CheckBox>()
.TakeWhile<CheckBox>(cb => cb.Checked);
(РЕДАКТИРОВАТЬ: Изменены AllControls на GetAllControls и использовать его как метод.)