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.pswp.cn/web/91807.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/91807.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鲸鱼优化算法(Whale Optimization Algorithm, WOA)是一种受座头鲸捕食行为启发的群体智能优化算法,由Seyedali Mirjalili于2016年提出

鲸鱼优化算法(Whale Optimization Algorithm, WOA)是一种受座头鲸捕食行为启发的群体智能优化算法,由Seyedali Mirjalili于2016年提出。 它通过模拟鲸鱼的狩猎策略(特别是“气泡网捕食”行为)来解决优化问题,广泛应用于函数优化、工程设计、机器学习参数优化等领域。以下…

信息量,惊奇度,熵、KL散度(相对熵),交叉熵、最大似然估计MLE与最小化交叉熵的等价证明、

一&#xff1a; 一些基本概念 1.1 信息量:特定事件所携带的信息多少信息量衡量的是特定事件所携带的信息多少&#xff0c;其数学定义为&#xff1a;其中p(x)是事件x发生的概率。核心思想&#xff1a;越罕见的事件&#xff0c;其携带的信息量越大&#xff1b;越常见的事件&#…

VBA 64位API声明语句第012讲

跟我学VBA&#xff0c;我这里专注VBA, 授人以渔。我98年开始&#xff0c;从源码接触VBA已经20余年了&#xff0c;随着年龄的增长&#xff0c;越来越觉得有必要把这项技能传递给需要这项技术的职场人员。希望职场和数据打交道的朋友&#xff0c;都来学习VBA,利用VBA,起码可以提高…

深入理解Java中String.intern()方法:从原理到并发控制实践

深入理解 Java 中 String.intern () 方法&#xff1a;从原理到并发控制实践 在 Java 开发中&#xff0c;String.intern()方法是一个看似简单却蕴含深意的 API。它在字符串常量池管理、内存优化以及并发控制等场景中有着关键作用。本文将从底层原理出发&#xff0c;结合实际案例…

在Linux中创建LVGL应用

在Linux中创建LVGL应用 简介 上一篇文章介绍了在imx6上开发UI的流程 . 这篇接上文&#xff0c; 介绍具体的开发步骤。 1. 创建项目主目录 mkdir my_lvgl_project cd my_lvgl_project2. 初始化 Git 仓库 (可选但推荐) git init echo "# My Project with Dependencies&…

大模型对比评测:Qwen2.5 VS Gemini 2.0谁更能打?

一、背景与选型关键 在 AI 应用落地的时代&#xff0c;“AI大模型选型对比”成为关键环节。选择合适的模型要综合考量性能、上下文长度、推理能力、中文/编程支持、成本等多维度指标。 本文重点比较 Gemini2.0Flash-Lite &#xff08;Preview&#xff09;、Gemini2.0Flash &a…

转置卷积解释与示例计算

文章目录转置卷积的三种等价实现方法&#xff1a;原理、公式与等价性分析数学定义与核心公式方法一&#xff1a;零填充翻转核卷积&#xff08;数学定义方法&#xff09;原理与公式等价性说明方法二&#xff1a;直接位置映射&#xff08;pytorch框架高效实现&#xff09;原理与公…

关于车位引导及汽车乘梯解决方案的专业性、系统性、可落地性强的综合设计方案与技术实现说明,旨在为现代智慧停车楼提供高效、安全、智能的停车体验。

一、系统概述随着城市土地资源日益紧张&#xff0c;立体停车、自动化停车成为发展趋势。本方案围绕“车位引导系统 汽车乘梯系统”构建智慧停车核心体系&#xff0c;结合地磁/视频/超声波检测、AI识别、语音交互、电梯自动调度等先进技术&#xff0c;实现车辆入场、引导、停泊…

【相机】曝光时间长-->拖影

曝光时间长 → 运动目标在快门开启期间持续移动 → 同一像素记录多个位置的能量 → 图像出现“拖影”&#xff08;运动模糊&#xff09;。&#x1f50d; 具体原因卷帘快门&#xff08;Rolling Shutter&#xff09;效应 RealSense 的 RGB 传感器&#xff08;如 IMX 系列&#xf…

day36 力扣1049.最后一块石头的重量II 力扣494.目标和 力扣474.一和零

最后一块石头的重量II有一堆石头&#xff0c;用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y&#xff0c;且 x < y。那么粉碎的可能结果如下&#…

Java内存模型(Java Memory Model,JMM)

​​ JMM​​ 是Java虚拟机&#xff08;JVM&#xff09;规范中定义的一组规则和规范&#xff0c;用于描述多线程环境下&#xff0c;Java程序中变量的访问和修改行为&#xff0c;尤其是在并发编程中如何保证内存可见性、原子性和有序性。JMM 是 Java 并发编程的基石&…

【swoole Windows 开发(swoole-cli 开发 hyperf)】

先前swoole在Windows平台的开发体验极差&#xff0c;如果在Windows开发swoole的东西可以用docker或者虚拟机&#xff0c;远程开发&#xff0c;体验比较好的是直接Mac或者Linux系统开发。但是作为window平台的钉子户表示我穷。swoole之前已经推出了cygwin64编译成winwods版本的方…

兴达餐饮 酒店 进销存管理系统软件

兴达餐饮 酒店 进销存管理系统软件

Seal Report:一款免费开源的报表工具

Seal Report 是一款基于 C# 语言开发的开源报表工具&#xff0c;可以从各种数据库或 NoSQL 数据源中生成日常报告&#xff0c;并且执行复杂的计划任务。 功能特性 免费开源&#xff1a;源代码托管在 GitHub 上&#xff0c;用户可以自由使用、修改、甚至集成到自己的系统中&…

WebRTC 多媒体 SDP 示例与解析

webRTC中的SDP的Bundlle可能包含一个或者多个媒体块&#xff08;媒体描述, 源码对应类ContentInfo&#xff09;&#xff0c;从 m 开始到下一个 m 行&#xff08;或 SDP 结束&#xff09;之间的所有属性&#xff08;包括 a&#xff09;都属于同一个媒体块&#xff08;media sect…

SpringBoot 启动富文本文字更改

正常来说 SpringBoot启动时候&#xff0c;展示的文字是这个 、 主播这边想要换一个样式&#xff0c;换一个自己自定义的文字 这边换成了自己的博客名字 具体实现操作如下 在项目目录 resources下创建一个名字为banner.txt的文本&#xff0c;这是SpringBoot启动的时候寻找的…

基于结构熵权-云模型的铸铁浴缸生产工艺安全评价

一、评价模型核心思想 结构熵权法 解决传统熵权法忽略指标间结构关系的问题,通过指标层次网络计算权重。 步骤: 构建工艺安全评价指标体系(树状/网络结构) 计算同级指标间的影响度矩阵 引入修正熵权:wj=1−Ej∑(1−Ek)结构影响因子w_j = \frac{1 - E_j}{\sum (1 - E_k)} \…

[Linux]从零开始的vs code交叉调试arm Linux程序教程

一、前言 最近的项目中需要集成rknn的视觉识别&#xff0c;在这之前我并且没有将rknn集成到自己项目的经验。这里我需要在rknn原本demo的基础上我还需要集成自己的业务代码。但是又有一个问题&#xff0c;原本rknn我们都是使用交叉编译编译到开发板上的&#xff0c;并且我们还要…

视频号私信自动化回复插件

给自己的浏览器插件又增加了视频号斯信的自动化回复搜索&#xff1a;程序员老狼主体逻辑就是&#xff0c;不停的点击打招呼和斯信那个tab切换查看有无小红点&#xff0c;有小红点的会话&#xff0c;就点击。查看有无打招呼&#xff0c;有打招呼就点击&#xff0c;抓取昵称和内容…

Web前端实现银河粒子流动特效的3种技术方案对比与实践

文章目录 前端实现银河粒子流动特效的技术原理与实践 引言:银河粒子特效的技术背景与现状 技术发展历史 当前技术现状 技术原理与实现方案 思维导图:银河粒子特效技术架构 1. CSS3实现方案 基础实现代码 性能优化技巧 2. Canvas 2D实现方案 基础实现代码 Canvas高级优化技术 …