Как я могу рекурсивно запросить все дочерние элементы Winform?

Я использую формы Windows. Как я могу рекурсивно запросить все дочерние элементы управления формы, которые имеют определенный тип?

В SQL для этого можно использовать самосоединение.

var result = 
  from this 
  join this ????
  where ctrl is TextBox || ctrl is Checkbox
  select ctrl;

Могу ли я также сделать это в LINQ?

РЕДАКТИРОВАТЬ:

LINQ поддерживает объединения. Почему я не могу использовать какое-то самосоединение?


person codymanix    schedule 26.03.2010    source источник


Ответы (2)


Что-то вроде этого должно работать (не идеальный код в любом случае ... просто для того, чтобы донести идею):

public IEnumerable<Control> GetSelfAndChildrenRecursive(Control parent)
{
    List<Control> controls = new List<Control>();

    foreach(Control child in parent.Controls)
    {
        controls.AddRange(GetSelfAndChildrenRecursive(child));
    }

    controls.Add(parent);

    return controls;
}

var result = GetSelfAndChildrenRecursive(topLevelControl)
    .Where(c => c is TextBox || c is Checkbox);
person Justin Niessner    schedule 26.03.2010
comment
Подпись возвращает IEnumerable, но на самом деле вы возвращаете список. Рассмотрите доходность возврата при отсрочке. - person as9876; 01.07.2016

может быть это поможет тебе ...

Как я могу получить все элементы управления из формы, включая элементы управления в любом контейнере?

как только у вас есть список, вы можете запросить его

person Luiscencio    schedule 26.03.2010