首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# CheckBox CheckedChanged 與 CheckStateChanged 事件差異深度解析

     編輯:關於C#

兩個事件核心差異

特性CheckedChangedCheckStateChanged
觸發條件Checked 屬性值改變 (true↔false)CheckState 屬性值改變 (Checked/Unchecked/Indeterminate)
ThreeState=false 時使用者點擊 → 觸發使用者點擊 → 觸發 (同 CheckedChanged)
ThreeState=true 時Checked↔Unchecked 觸發;
Checked→Indeterminate 不觸發 (Checked 仍為 true)
三狀態任意切換皆觸發
適用場景只關心「是否勾選」需區分「未勾選/勾選/不確定」三態

屬性關係圖解

ThreeState = false (預設)          ThreeState = true
┌─────────────────────┐           ┌─────────────────────┐
│ CheckState          │           │ CheckState          │
│   Unchecked (0)     │←─點擊─→│   Unchecked (0)     │
│   Checked (1)       │           │   Checked (1)       │
│                     │           │   Indeterminate (2) │←─第三態
└─────────────────────┘           └─────────────────────┘
Checked 屬性:                     Checked 屬性:
  false  →  true                      false → true → true (Indeterminate 時仍為 true)

事件觸發順序實測

private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
    Console.WriteLine($"[CheckedChanged] Checked={checkBox1.Checked}, CheckState={checkBox1.CheckState}");
}

private void checkBox1_CheckStateChanged(object sender, EventArgs e)
{
    Console.WriteLine($"[CheckStateChanged] Checked={checkBox1.Checked}, CheckState={checkBox1.CheckState}");
}

ThreeState=true 時,使用者點擊順序:Unchecked → Checked → Indeterminate → Unchecked

// 第一次點擊:Unchecked → Checked
[CheckedChanged] Checked=True, CheckState=Checked
[CheckStateChanged] Checked=True, CheckState=Checked

// 第二次點擊:Checked → Indeterminate
[CheckStateChanged] Checked=True, CheckState=Indeterminate  // CheckedChanged **未觸發**

// 第三次點擊:Indeterminate → Unchecked
[CheckedChanged] Checked=False, CheckState=Unchecked
[CheckStateChanged] Checked=False, CheckState=Unchecked

程式碼設定屬性時的行為

// 程式碼設定 Checked = true
checkBox1.Checked = true;
// 觸發:CheckedChanged + CheckStateChanged (順序:CheckedChanged 先)

// 程式碼設定 CheckState = Indeterminate
checkBox1.CheckState = CheckState.Indeterminate;
// 觸發:CheckStateChanged (CheckedChanged 不觸發,因 Checked 維持 true)

最佳實務建議

  • 一般勾選框 (Two-State): 僅訂閱 CheckedChanged,邏輯最簡單。
  • 三態勾選框 (父子選項): 需同時處理兩事件,或統一用 CheckStateChanged 並檢查 CheckState 列舉值。
  • 避免重複邏輯: 若兩事件都訂閱,務必注意 CheckedChanged 在 Indeterminate 狀態不觸發,可能導致狀態不同步。
  • 資料繫結: Checked 繫結 bool,CheckState 繫結 CheckState 列舉;三態建議繫結 CheckState。

視覺化示意圖

參考資源

原文連結:https://www.bianceng.cn/Programming/csharp/201410/45586.htm

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