当前位置: 首页 > news >正文

WinForm之CheckBox 控件

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 的事件主要用于响应选择状态的变化,常用事件如下:

事件名触发时机
CheckedChangedChecked 属性值改变时触发(基础事件),无论从 True 变为 False 还是相反,都会触发。
CheckStateChangedCheckState 属性值改变时触发(扩展事件,适用于三态模式,涵盖 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 是实现 “多项选择” 的核心控件,通过灵活的状态控制和事件处理,可满足从简单多选到复杂父子关联的多种交互需求,是表单设计中处理 “非互斥选择” 场景的首选。

http://www.lryc.cn/news/605968.html

相关文章:

  • FPGA实现AD9361采集转SRIO与DSP交互,FPGA+DSP多核异构信号处理架构,提供2套工程源码和技术支持
  • Golang 调试技巧:在 Goland 中查看 Beego 控制器接收的前端字段参数
  • 在超算平台异构加速卡AI * 1卡的Ubuntu20.04环境下安装docker服务(未成功)
  • 【Golang】用官方rate包构造简单IP限流器
  • 【14】大恒相机SDK C#开发 ——Bitmap.UnlockBits()什么意思?有什么用?bmpData.Scan0;什么意思?有什么用?
  • go goroutine chan 用法
  • 网络编程(一)TCP编程和UDP编程
  • 前端工程化包管理器:从npm基础到nvm多版本管理实战
  • Vue多请求并行处理实战指南
  • Acrel-1000系列分布式光伏监控系统在湖北荆门一马光彩大市场屋顶光伏发电项目中应用
  • 【人工智能-15】OpenCV直方图均衡化,模板匹配,霍夫变换,图像亮度变换,形态学变换
  • webpack-babel
  • ESXI虚拟交换机 + H3C S5120交换机 + GR5200路由器组网笔记
  • 如何将照片从 realme 手机传输到电脑?
  • 使用橙武低代码平台构建摄影店管理系统的完整指南
  • 【爬虫实战】使用Python和JS逆向基于webpack的游戏平台
  • Rust × WebAssembly 项目脚手架详解
  • Kubernetes 应用部署实战:为什么需要 Kubernetes?
  • 本土发货模式兴起,如何选择合适的海外仓系统?
  • 单张卡牌类
  • 星云能量传送特效技术详解
  • Servlet修改新增思路
  • C语言---结构体(格式、用法、嵌套、初始化)、共用体、枚举类型、typedef类型
  • 舱驾操作系统架构规划
  • 使用的IDE没有内置MCP客户端怎么办?
  • AI 类型的 IDE
  • AI IDE+AI 辅助编程-生成的大纲-一般般
  • 掩码语言模型(MLM)技术解析:理论基础、演进脉络与应用创新
  • 从循环依赖谈 Chromium 模块化设计:编译结构与最佳实践
  • 基于 Amazon Nova Sonic 和 MCP 构建语音交互 Agent