W C # (ponieważ oznaczyłeś go jako taki) możesz użyć wyrażenia LINQ w następujący sposób:
List<Control> c = Controls.OfType<TextBox>().Cast<Control>().ToList();
Edytuj dla rekursji:
W tym przykładzie najpierw tworzysz listę kontrolek, a następnie wywołujesz metodę, aby ją wypełnić. Ponieważ metoda jest rekurencyjna, nie zwraca listy, a jedynie ją aktualizuje.
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);
}
}
Może to być możliwe w jednej instrukcji LINQ przy użyciu Descendants
funkcji, chociaż nie jestem z nią tak zaznajomiony. Zobacz tę stronę, aby uzyskać więcej informacji na ten temat.
Edytuj 2, aby zwrócić kolekcję:
Jak zasugerował @ProfK, metoda, która po prostu zwraca żądane kontrolki, jest prawdopodobnie lepszą praktyką. Aby to zilustrować, zmodyfikowałem kod w następujący sposób:
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;
}