Di C # (karena Anda menandainya seperti itu) Anda bisa menggunakan ekspresi LINQ seperti ini:
List<Control> c = Controls.OfType<TextBox>().Cast<Control>().ToList();
Edit untuk rekursi:
Dalam contoh ini, Anda terlebih dahulu membuat daftar kontrol dan kemudian memanggil metode untuk mengisinya. Karena metode ini rekursif, itu tidak mengembalikan daftar, itu hanya memperbaruinya.
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);
}
}
Hal ini dimungkinkan untuk melakukan ini dalam satu pernyataan LINQ menggunakan Descendants
fungsi tersebut, meskipun saya tidak begitu terbiasa dengannya. Lihat halaman ini untuk informasi lebih lanjut tentang itu.
Edit 2 untuk mengembalikan koleksi:
Seperti yang disarankan @ProfK, metode yang hanya mengembalikan kontrol yang diinginkan mungkin merupakan praktik yang lebih baik. Untuk mengilustrasikan ini, saya telah memodifikasi kode sebagai berikut:
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;
}