Encontre todos os controles filho de tipo específico usando Enumerable.OfType () ou LINQ

MyControl1.Controls.OfType() só pesquisa a coleção inicial e não entra para filhos.

É possível encontrar todos os controles filho de tipo específico usando Enumerable.OfType() ou LINQ sem escrever o próprio método recursivo? Assim.

Eu uso um método de extensão para nivelar a hierarquia de controle e, em seguida, aplicar filtros, de modo que está usando o próprio método recursivo.

O método se parece com isso

 public static IEnumerable FlattenChildren(this Control control) { var children = control.Controls.Cast(); return children.SelectMany(c => FlattenChildren(c)).Concat(children); } 

Eu uso esse método recursivo genérico:

A suposição desse método é que, se o controle for T, o método não será exibido em seus filhos. Se você também precisa olhar para seus filhos, você pode facilmente mudá-lo de acordo.

 public static IList GetAllControlsRecusrvive(Control control) where T :Control { var rtn = new List(); foreach (Control item in control.Controls) { var ctr = item as T; if (ctr!=null) { rtn.Add(ctr); } else { rtn.AddRange(GetAllControlsRecusrvive(item)); } } return rtn; } 

Para melhorar a resposta acima, faria sentido alterar o tipo de retorno para

 //Returns all controls of a certain type in all levels: public static IEnumerable AllControls( this Control theStartControl ) where TheControlType : Control { var controlsInThisLevel = theStartControl.Controls.Cast(); return controlsInThisLevel.SelectMany( AllControls ).Concat( controlsInThisLevel.OfType() ); } //(Another way) Returns all controls of a certain type in all levels, integrity derivation: public static IEnumerable AllControlsOfType( this Control theStartControl ) where TheControlType : Control { return theStartControl.AllControls().OfType(); }