窗體有 10 個原有 CheckBox,新增 2 個不想納入「勾選超 4 個報警」的計數邏輯。
int n = this.Controls.OfType()
.Where(x => x.Checked).Count();
if (n > 3) { /* 顯示警告 */ }
新增 CheckBox 設置 Name 含特定前綴(如 chkNew_)或 Tag 標記。
// 1. 通過 Name 過濾
int n = this.Controls.OfType()
.Where(x => x.Checked && !x.Name.StartsWith("chkNew_"))
.Count();
// 2. 通過 Tag 過濾 (設計器設置 Tag="Exclude")
int n = this.Controls.OfType()
.Where(x => x.Checked && x.Tag?.ToString() != "Exclude")
.Count();
int n = this.Controls.OfType()
.Take(10) // 僅取前 10 個 (原有項)
.Where(x => x.Checked)
.Count();
前提:Controls 集合順序與設計器 Z-Order 一致,新增控件在集合末尾。
// 窗體構造時初始化
private List _monitoredBoxes = new List();
// 初始化邏輯
_monitoredBoxes.AddRange(new[] { chk1, chk2, ..., chk10 }); // 僅加入需監控的
// 計數邏輯
int n = _monitoredBoxes.Count(x => x.Checked);
| 方案 | 優點 | 缺點 | 適用 |
|---|---|---|---|
| Name/Tag 過濾 | 聲明式、無需維護列表、動態增減自適應 | 依賴命名規範/Tag 設置 | 控件數量固定、命名規範良好 |
| Take(N) | 代碼極短 | 極其脆弱,調整佈局順序即失效 | 快速原型/一次性腳本 |
| 專用列表 | 完全可控、編譯期檢查、重構友好 | 需手動維護列表 | 核心業務邏輯、長期維護項目 |
// 統一綁定 CheckedChanged
foreach (var cb in _monitoredBoxes) cb.CheckedChanged += OnMonitoredCheckedChanged;
void OnMonitoredCheckedChanged(object sender, EventArgs e) {
int n = _monitoredBoxes.Count(x => x.Checked);
lblWarn.Visible = n > 3;
}
推薦**方案三(專用列表)**:業務邏輯與 UI 結構解耦,最易測試、重構、擴展。