WinForm之CheckBox 控件

发布于:2025-08-01 ⋅ 阅读:(11) ⋅ 点赞:(0)

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 适用于需要 “多选” 或 “独立开关” 的场景,常见用法如下:

  1. 多项选择 一组 CheckBox 允许用户选择多个选项(如爱好:篮球、足球、游泳、阅读)。

  2. 功能开关 单个 CheckBox 作为功能开关(如 “记住密码”“自动登录”“启用通知”)。

  3. 三态选择(父子关联) 启用三态模式(ThreeState = true),父 CheckBox 用 Indeterminate 状态表示 “部分子选项被选中”(如文件夹选择:父文件夹部分子文件被选中)。

  4. 关联控件启用 / 禁用 根据 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 的核心用法,重点包括:

  1. 基础多选功能:通过一组 CheckBox 实现爱好选择,用户可同时选中多个选项;“其他” 选项选中时,通过 CheckedChanged 事件显示关联的输入框,实现条件交互。

  2. 功能开关场景:模拟系统设置中的开关(记住密码、自动登录等),单个 CheckBox 独立控制一项功能,默认选中 “启用消息通知”。

  3. 三态模式与父子关联:父 CheckBox 启用三态模式(ThreeState = true),根据子选项的选中情况自动切换状态:

    • 全选 → 父选项 Checked

    • 全不选 → 父选项 Unchecked

    • 部分选中 → 父选项 Indeterminate(半选状态) 同时,点击父选项可反向控制子选项(全选 / 全不选)。

  4. 按钮样式复选框:设置 Appearance = Appearance.Button 后,CheckBox 呈现按钮样式,选中时呈按下状态,适合作为功能开关(如深色模式、全屏显示)。

  5. 结果获取:通过 “显示选中结果” 按钮遍历 CheckBox 的 Checked 属性,收集并展示选中的爱好,演示如何处理多选结果。

使用注意事项

  1. 与 RadioButton 的区别 CheckBox 支持多选(状态独立),RadioButton 支持单选(同组互斥),选择控件时需根据业务场景(多选 / 单选)决定。

  2. 三态模式的启用 Indeterminate 状态仅在 ThreeState = true 时有效,通常用于 “部分选择” 的抽象场景(如树形结构、列表批量选择),普通多选场景无需启用。

  3. 事件选择 基础场景用 CheckedChanged 即可;三态模式需监听 CheckStateChanged 以响应 Indeterminate 状态变化。

  4. 状态判断顺序 判断 CheckState 时,建议先检查 Indeterminate,再检查 Checked/Unchecked(避免逻辑错误)。

  5. 批量处理选中项 遍历一组 CheckBox 时,可通过 Checked 属性筛选选中项(如示例中 “显示选中结果” 的逻辑),无需逐个判断。

CheckBox 是实现 “多项选择” 的核心控件,通过灵活的状态控制和事件处理,可满足从简单多选到复杂父子关联的多种交互需求,是表单设计中处理 “非互斥选择” 场景的首选。