CheckBox(复选框)是 WinForm 中用于实现 “多项选择” 的控件,允许用户从一组选项中选择任意数量的项(包括零项、一项或多项),适用于需要同时选择多个选项的场景(如爱好、权限设置、功能开关等)。与 RadioButton(单选按钮)的 “互斥选择” 不同,CheckBox 各组选项之间相互独立,选择状态互不影响。
CheckBox 控件的核心属性
CheckBox 的核心特性是 “多选性” 和 “独立状态”,其属性围绕选择状态和外观展开,常用属性如下:
属性名 | 作用描述 |
---|---|
Checked |
布尔值,获取或设置复选框是否被选中(True 表示选中,基础状态属性)。例如:checkBox1.Checked = true 可默认选中。 |
CheckState |
枚举值,获取或设置复选框的状态(扩展状态属性),可选值: - Unchecked :未选中(默认) - Checked :选中 - Indeterminate :不确定(半选状态,仅当 ThreeState = true 时有效) |
ThreeState |
布尔值,控制是否启用三态模式(默认 False )。设为 True 时,CheckState 可设为 Indeterminate (半选状态,通常用于父选项表示 “部分子选项被选中”)。 |
Text |
复选框旁边显示的文本(如 “篮球”“足球”“同意条款”)。 |
Appearance |
控制外观样式: - Normal :默认样式(方形复选框 + 文本) - Button :按钮样式(选中时呈按下状态,类似开关) |
AutoCheck |
布尔值,控制点击时是否自动切换选中状态(默认 True ,设为 False 需手动处理状态变化)。 |
Enabled /Visible |
控制控件是否启用 / 可见(同其他控件)。 |
TextAlign |
文本相对于复选框的对齐方式(如 MiddleRight 文本在右侧居中)。 |
CheckBox 控件的常用事件
CheckBox 的事件主要用于响应选择状态的变化,常用事件如下:
事件名 | 触发时机 |
---|---|
CheckedChanged |
当 Checked 属性值改变时触发(基础事件),无论从 True 变为 False 还是相反,都会触发。 |
CheckStateChanged |
当 CheckState 属性值改变时触发(扩展事件,适用于三态模式,涵盖 Indeterminate 状态变化)。 |
Click |
点击复选框时触发(可能不反映状态变化,不如状态事件精准)。 |
CheckBox 控件的典型用法
CheckBox 适用于需要 “多选” 或 “独立开关” 的场景,常见用法如下:
多项选择 一组 CheckBox 允许用户选择多个选项(如爱好:篮球、足球、游泳、阅读)。
功能开关 单个 CheckBox 作为功能开关(如 “记住密码”“自动登录”“启用通知”)。
三态选择(父子关联) 启用三态模式(
ThreeState = true
),父 CheckBox 用Indeterminate
状态表示 “部分子选项被选中”(如文件夹选择:父文件夹部分子文件被选中)。关联控件启用 / 禁用 根据 CheckBox 的选中状态,动态启用或禁用其他控件(如选中 “其他” 时,显示自定义输入框)。
基础多选示例(爱好选择)
按钮样式复选框(开关效果)
使用示例:多样化的 CheckBox 效果
以下代码演示了 CheckBox 的核心用法,包括基础多选、三态模式、功能开关及关联控件等场景:
using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Windows.Forms; namespace CheckBoxDemo { public class CheckBoxExampleForm : Form { // 用于关联显示的文本框(选中"其他"时显示) private TextBox otherTextBox; // 子复选框(用于演示三态父复选框) private List<CheckBox> childCheckboxes = new List<CheckBox>(); public CheckBoxExampleForm() { // 窗体基础设置 Text = "CheckBox 控件示例"; Size = new Size(500, 450); StartPosition = FormStartPosition.CenterScreen; otherTextBox = new TextBox(); Controls.AddRange(CreateCheckboxes()); // 添加所有控件 } // 创建不同功能的CheckBox控件 private Control[] CreateCheckboxes() { List<Control> controls = new List<Control>(); // 1. 基础多选示例(爱好选择) Label hobbyLabel = new Label { Text = "1. 请选择爱好(可多选):", Location = new Point(30, 30), AutoSize = true }; controls.Add(hobbyLabel); // 爱好选项 CheckBox basketballCheck = new CheckBox { Text = "篮球", Location = new Point(50, 60), AutoSize = true }; CheckBox footballCheck = new CheckBox { Text = "足球", Location = new Point(150, 60), AutoSize = true }; CheckBox readingCheck = new CheckBox { Text = "阅读", Location = new Point(250, 60), AutoSize = true }; CheckBox musicCheck = new CheckBox { Text = "音乐", Location = new Point(350, 60), AutoSize = true }; CheckBox otherCheck = new CheckBox { Text = "其他", Location = new Point(450, 60), AutoSize = true }; controls.AddRange(new[] { basketballCheck, footballCheck, readingCheck, musicCheck, otherCheck }); // 关联的"其他"输入框 otherTextBox = new TextBox { Location = new Point(50, 90), Size = new Size(200, 20), PlaceholderText = "请输入其他爱好", Visible = false // 初始隐藏 }; controls.Add(otherTextBox); // 绑定"其他"复选框的状态变化 otherCheck.CheckedChanged += (sender, e) => { otherTextBox.Visible = otherCheck.Checked; // 选中则显示 }; // 2. 功能开关示例(系统设置) Label settingLabel = new Label { Text = "2. 系统设置(功能开关):", Location = new Point(30, 130), AutoSize = true }; controls.Add(settingLabel); CheckBox rememberCheck = new CheckBox { Text = "记住密码", Location = new Point(50, 160), AutoSize = true }; CheckBox autoLoginCheck = new CheckBox { Text = "自动登录", Location = new Point(200, 160), AutoSize = true }; CheckBox notifyCheck = new CheckBox { Text = "启用消息通知", Location = new Point(350, 160), AutoSize = true, Checked = true // 默认启用 }; controls.AddRange(new[] { rememberCheck, autoLoginCheck, notifyCheck }); // 3. 三态复选框示例(父子关联) Label threeStateLabel = new Label { Text = "3. 三态复选框(父子关联):", Location = new Point(30, 200), AutoSize = true }; controls.Add(threeStateLabel); // 父复选框(三态) CheckBox parentCheck = new CheckBox { Text = "全选/反选", Location = new Point(50, 230), AutoSize = true, ThreeState = true, // 启用三态模式 CheckState = CheckState.Unchecked }; controls.Add(parentCheck); // 子复选框(3个) for (int i = 1; i <= 3; i++) { CheckBox childCheck = new CheckBox { Text = $"子选项 {i}", Location = new Point(100, 260 + (i - 1) * 30), AutoSize = true }; childCheckboxes.Add(childCheck); controls.Add(childCheck); // 子选项状态变化时,更新父复选框状态 childCheck.CheckedChanged += (sender, e) => UpdateParentCheckState(parentCheck); } // 父复选框状态变化时,同步子选项 parentCheck.CheckStateChanged += (sender, e) => { if (parentCheck.CheckState == CheckState.Checked) { // 全选 childCheckboxes.ForEach(c => c.Checked = true); } else if (parentCheck.CheckState == CheckState.Unchecked) { // 全不选 childCheckboxes.ForEach(c => c.Checked = false); } // Indeterminate状态由子选项自动触发,无需手动处理 }; // 4. 按钮样式复选框(开关效果) Label buttonStyleLabel = new Label { Text = "4. 按钮样式复选框:", Location = new Point(30, 350), AutoSize = true }; controls.Add(buttonStyleLabel); CheckBox darkModeCheck = new CheckBox { Text = "深色模式", Location = new Point(50, 380), Size = new Size(100, 30), Appearance = Appearance.Button, // 按钮样式 FlatStyle = FlatStyle.Flat }; CheckBox fullscreenCheck = new CheckBox { Text = "全屏显示", Location = new Point(200, 380), Size = new Size(100, 30), Appearance = Appearance.Button, FlatStyle = FlatStyle.Flat }; controls.AddRange(new[] { darkModeCheck, fullscreenCheck }); // 5. 显示选中结果的按钮和标签 Button showResultButton = new Button { Text = "显示选中结果", Location = new Point(350, 380), Size = new Size(120, 30) }; Label resultLabel = new Label { Text = "选中的爱好:无", Location = new Point(50, 420), AutoSize = true, ForeColor = Color.Blue }; controls.AddRange(new[] { showResultButton, resultLabel }); // 点击按钮时,获取选中的爱好 showResultButton.Click += (sender, e) => { List<string> selectedHobbies = new List<string>(); if (basketballCheck.Checked) selectedHobbies.Add("篮球"); if (footballCheck.Checked) selectedHobbies.Add("足球"); if (readingCheck.Checked) selectedHobbies.Add("阅读"); if (musicCheck.Checked) selectedHobbies.Add("音乐"); if (otherCheck.Checked && !string.IsNullOrEmpty(otherTextBox.Text)) selectedHobbies.Add(otherTextBox.Text); resultLabel.Text = $"选中的爱好:{ (selectedHobbies.Any() ? string.Join("、", selectedHobbies) : "无") }"; }; return controls.ToArray(); } // 更新父复选框的三态状态(根据子选项选中情况) private void UpdateParentCheckState(CheckBox parentCheck) { int checkedCount = childCheckboxes.Count(c => c.Checked); if (checkedCount == 0) { parentCheck.CheckState = CheckState.Unchecked; // 全不选 } else if (checkedCount == childCheckboxes.Count) { parentCheck.CheckState = CheckState.Checked; // 全选 } else { parentCheck.CheckState = CheckState.Indeterminate; // 部分选中(半选) } } // 程序入口 [STAThread] static void Main() { Application.EnableVisualStyles(); Application.Run(new CheckBoxExampleForm()); } } }
代码说明
这个示例展示了 CheckBox 的核心用法,重点包括:
基础多选功能:通过一组 CheckBox 实现爱好选择,用户可同时选中多个选项;“其他” 选项选中时,通过
CheckedChanged
事件显示关联的输入框,实现条件交互。功能开关场景:模拟系统设置中的开关(记住密码、自动登录等),单个 CheckBox 独立控制一项功能,默认选中 “启用消息通知”。
三态模式与父子关联:父 CheckBox 启用三态模式(
ThreeState = true
),根据子选项的选中情况自动切换状态:全选 → 父选项
Checked
全不选 → 父选项
Unchecked
部分选中 → 父选项
Indeterminate
(半选状态) 同时,点击父选项可反向控制子选项(全选 / 全不选)。
按钮样式复选框:设置
Appearance = Appearance.Button
后,CheckBox 呈现按钮样式,选中时呈按下状态,适合作为功能开关(如深色模式、全屏显示)。结果获取:通过 “显示选中结果” 按钮遍历 CheckBox 的
Checked
属性,收集并展示选中的爱好,演示如何处理多选结果。
使用注意事项
与 RadioButton 的区别 CheckBox 支持多选(状态独立),RadioButton 支持单选(同组互斥),选择控件时需根据业务场景(多选 / 单选)决定。
三态模式的启用
Indeterminate
状态仅在ThreeState = true
时有效,通常用于 “部分选择” 的抽象场景(如树形结构、列表批量选择),普通多选场景无需启用。事件选择 基础场景用
CheckedChanged
即可;三态模式需监听CheckStateChanged
以响应Indeterminate
状态变化。状态判断顺序 判断
CheckState
时,建议先检查Indeterminate
,再检查Checked
/Unchecked
(避免逻辑错误)。批量处理选中项 遍历一组 CheckBox 时,可通过
Checked
属性筛选选中项(如示例中 “显示选中结果” 的逻辑),无需逐个判断。
CheckBox 是实现 “多项选择” 的核心控件,通过灵活的状态控制和事件处理,可满足从简单多选到复杂父子关联的多种交互需求,是表单设计中处理 “非互斥选择” 场景的首选。