ใน C # (เนื่องจากคุณติดแท็กไว้เช่นนี้) คุณสามารถใช้นิพจน์ LINQ ดังนี้:
List<Control> c = Controls.OfType<TextBox>().Cast<Control>().ToList();
แก้ไขสำหรับการเรียกซ้ำ:
ในตัวอย่างนี้คุณต้องสร้างรายการตัวควบคุมก่อนแล้วจึงเรียกใช้วิธีการเพื่อเติมข้อมูล เนื่องจากวิธีนี้เป็นแบบวนซ้ำจึงไม่ส่งคืนรายการ แต่เพียงแค่อัปเดต
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);
}
}
อาจเป็นไปได้ที่จะทำสิ่งนี้ในคำสั่ง LINQ โดยใช้Descendants
ฟังก์ชันนี้แม้ว่าฉันจะไม่คุ้นเคยกับมัน ดูหน้านี้สำหรับข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนั้น
แก้ไข 2 เพื่อส่งคืนคอลเล็กชัน:
ตามที่ @ProfK แนะนำวิธีที่ส่งคืนการควบคุมที่ต้องการก็น่าจะเป็นแนวทางปฏิบัติที่ดีกว่า เพื่อแสดงให้เห็นสิ่งนี้ฉันได้แก้ไขโค้ดดังนี้:
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;
}