| 特性 | CheckedChanged | CheckStateChanged |
|---|---|---|
| 觸發條件 | 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)
CheckedChanged,邏輯最簡單。CheckStateChanged 並檢查 CheckState 列舉值。CheckedChanged 在 Indeterminate 狀態不觸發,可能導致狀態不同步。Checked 繫結 bool,CheckState 繫結 CheckState 列舉;三態建議繫結 CheckState。
原文連結:https://www.bianceng.cn/Programming/csharp/201410/45586.htm