在 WinForms 或 WebForms 中,常需批次處理特定類型控制項,例如:清空所有 TextBox、設定唯讀、驗證輸入等。本文示範如何遞迴遍歷控制項集合,找出所有 TextBox 並賦值。
foreach (Control control in this.Controls)
{
// 判斷是否為 TextBox (含繼承關係)
if (control is TextBox)
{
// 型別轉換 (Liskov 替換原則)
TextBox textBox = (TextBox)control;
// 執行想要的操作
textBox.Text = "Hello World.";
}
}
上述程式碼僅遍歷第一層控制項,若 TextBox 置於 Panel、GroupBox、TabPage 等容器內,需遞迴搜尋:
///
/// 遞迴遍歷控制項樹,對所有 TextBox 執行指定動作
///
public void ProcessAllTextBoxes(Control parent, Action action)
{
foreach (Control ctrl in parent.Controls)
{
if (ctrl is TextBox tb)
{
action(tb);
}
// 若有子控制項,遞迴進入
if (ctrl.HasChildren)
{
ProcessAllTextBoxes(ctrl, action);
}
}
}
// 呼叫範例:將所有 TextBox 文字設為 "Hello World."
ProcessAllTextBoxes(this, tb => tb.Text = "Hello World.");
MaskedTextBox 也會被視為 TextBox 的子類別)。if (ctrl is TextBox tb) 簡化寫法。Control 皆擁有 Controls 屬性,形成樹狀結構。action(tb) => tb.Clear()action(tb) => tb.ReadOnly = trueaction(tb) => { if (string.IsNullOrWhiteSpace(tb.Text)) errors.Add(tb.Name); }action(tb) => tb.CssClass = "form-control" (WebForms)ASP.NET WebForms 中,this.Controls 僅包含頁面最上層控制項,ContentPlaceHolder、Form、UpdatePanel 等皆為容器,實務上建議從 Page.Form 或特定容器開始遞迴,或使用 Page.FindControl 定位特定命名控制項。