En C # (ya que lo etiquetó como tal) podría usar una expresión LINQ como esta:
List<Control> c = Controls.OfType<TextBox>().Cast<Control>().ToList();
Editar para recursividad:
En este ejemplo, primero crea la lista de controles y luego llama a un método para completarla. Dado que el método es recursivo, no devuelve la lista, solo la actualiza.
List<Control> ControlList = new List<Control>();
private void GetAllControls(Control container)
{
foreach (Control c in container.Controls)
{
GetAllControls(c);
if (c is TextBox) ControlList.Add(c);
}
}
Puede ser posible hacer esto en una declaración LINQ usando la Descendants
función, aunque no estoy tan familiarizado con ella. Consulte esta página para obtener más información al respecto.
Edite 2 para devolver una colección:
Como sugirió @ProfK, un método que simplemente devuelve los controles deseados probablemente sea una mejor práctica. Para ilustrar esto, modifiqué el código de la siguiente manera:
private IEnumerable<Control> GetAllTextBoxControls(Control container)
{
List<Control> controlList = new List<Control>();
foreach (Control c in container.Controls)
{
controlList.AddRange(GetAllTextBoxControls(c));
if (c is TextBox)
controlList.Add(c);
}
return controlList;
}