首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

WinForm CheckBox 集合計數排除新增項:LINQ Where 條件過濾或 Take 限制數量

     編輯:程式設計綜合問答

場景

窗體有 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();

方案二:按佈局順序取前 10 個(若新增在最後)

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 結構解耦,最易測試、重構、擴展。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved