WinForm真入门(10)——CheckBox控件详解
在 WinForm 中,CheckBox 控件是一个用于表示布尔状态(选中/未选中)的核心组件。它广泛应用于配置选项、表单提交、条件筛选等场景。以下是 CheckBox 的详细解析,涵盖属性、事件、使用技巧和实际案例。
一、CheckBox 核心属性
| 属性 | 说明 | 示例 |
|---|---|---|
| Checked | 表示是否被选中(true/false)。 | checkBox1.Checked = true; |
| Text | 显示在 CheckBox 旁的文本。 | checkBox1.Text = “启用功能”; |
| AutoCheck | 是否自动切换选中状态(默认为 true)。设为 false 时需手动处理点击事件。 | checkBox1.AutoCheck = false; |
| ThreeState | 是否支持三种状态(Checked, Unchecked, Indeterminate)。 | checkBox1.ThreeState = true; |
| CheckState | 当 ThreeState 为 true 时,表示当前状态。 | checkBox1.CheckState = CheckState.Indeterminate; |
| Appearance | 外观样式:Normal(默认)或 Button(显示为按钮)。 | checkBox1.Appearance = Appearance.Button; |
| FlatStyle | 平面样式:Standard, Flat, Popup, System。 | checkBox1.FlatStyle = FlatStyle.Flat; |
二、CheckBox 关键事件
| 事件 | 触发条件 | 示例 |
|---|---|---|
| CheckedChanged | Checked 值改变时触发。 | checkBox1.CheckedChanged += (s, e) => { label1.Text = checkBox1.Checked ? “已选中” : “未选中”;}; |
| CheckStateChanged | CheckState 改变时触发(仅当 ThreeState = true)。 | checkBox1.CheckStateChanged += (s, e) => { if (checkBox1.CheckState == CheckState.Indeterminate) { // 处理中间状态 } |
三、CheckBox 使用场景与示例
1. 基础功能开关
// 控制一个 TextBox 的可见性
checkBox1.CheckedChanged += (s, e) => {textBox1.Visible = checkBox1.Checked;
};
2. 批量处理多个 CheckBox
// 动态生成多个 CheckBox 并收集选中项
List<string> selectedOptions = new List<string>();
List<string> options = new List<string> { "选项1", "选项2", "选项3" };foreach (var option in options) {CheckBox cb = new CheckBox() { Text = option };cb.CheckedChanged += (s, e) => {if (cb.Checked) selectedOptions.Add(cb.Text);else selectedOptions.Remove(cb.Text);};flowLayoutPanel1.Controls.Add(cb);
}
3. 三态 CheckBox(ThreeState)
// 模拟“部分选中”状态(如文件夹权限)
checkBox1.ThreeState = true;
checkBox1.CheckStateChanged += (s, e) => {switch (checkBox1.CheckState) {case CheckState.Checked:// 全选子项break;case CheckState.Unchecked:// 取消所有子项break;case CheckState.Indeterminate:// 部分子项选中break;}
};
四、高级技巧
1. 数据绑定(Data Binding)
将 CheckBox 绑定到数据模型的布尔属性:
public class Settings {public bool IsFeatureEnabled { get; set; }
}Settings settings = new Settings();
checkBox1.DataBindings.Add("Checked", settings, "IsFeatureEnabled");
2. 自定义绘制(OwnerDraw)
通过 FlatStyle = OwnerDraw 实现完全自定义样式:
checkBox1.FlatStyle = FlatStyle.OwnerDraw;
checkBox1.DrawItem += (s, e) => {CheckBox cb = (CheckBox)s;Graphics g = e.Graphics;// 绘制自定义背景、图标和文本g.FillRectangle(Brushes.White, e.Bounds);g.DrawImage(cb.Checked ? Properties.Resources.CheckedIcon : Properties.Resources.UncheckedIcon, e.Bounds.Left, e.Bounds.Top);TextRenderer.DrawText(g, cb.Text, cb.Font, new Point(e.Bounds.Left + 25, e.Bounds.Top), Color.Black);
};
3. 异步操作处理
在事件中执行耗时操作时,确保线程安全:
checkBox1.CheckedChanged += async (s, e) => {if (checkBox1.Checked) {// 使用异步避免界面卡顿await Task.Run(() => {// 模拟耗时操作Thread.Sleep(1000);});MessageBox.Show("操作完成!");}
};
五、常见问题与解决方案
1. CheckedChanged 事件多次触发
原因: 可能因代码中直接修改 Checked 属性导致。
解决: 使用标志位或临时禁用事件:
private bool _isUpdating = false;checkBox1.CheckedChanged += (s, e) => {if (_isUpdating) return;_isUpdating = true;// 业务逻辑..._isUpdating = false;
};
2. 界面闪烁
原因: 频繁重绘控件。
解决: 启用双缓冲:
public class CustomCheckBox : CheckBox {public CustomCheckBox() {SetStyle(ControlStyles.OptimizedDoubleBuffer, true);}
}
六、完整示例:动态生成并管理 CheckBox
public partial class Form1 : Form {public Form1() {InitializeComponent();CreateCheckBoxes();}private void CreateCheckBoxes() {List<string> items = new List<string> { "苹果", "香蕉", "橘子" };int y = 20;foreach (var item in items) {CheckBox cb = new CheckBox();cb.Text = item;cb.Location = new Point(20, y);cb.CheckedChanged += (s, e) => {UpdateSelectedItems();};this.Controls.Add(cb);y += 30;}}private void UpdateSelectedItems() {var selected = this.Controls.OfType<CheckBox>().Where(cb => cb.Checked).Select(cb => cb.Text);listBox1.DataSource = selected.ToList();}
}
通过掌握这些核心知识和技巧,你可以灵活运用 CheckBox 构建复杂的交互逻辑。如果需要进一步优化样式或行为,可结合自定义控件和高级图形绘制技术。
本系列教程持续更新中。。。
相关文章:
WinForm真入门(10)——CheckBox控件详解
在 WinForm 中,CheckBox 控件是一个用于表示布尔状态(选中/未选中)的核心组件。它广泛应用于配置选项、表单提交、条件筛选等场景。以下是 CheckBox 的详细解析,涵盖属性、事件、使用技巧和实际案例。 一、CheckBox 核心属性…...
网络安全应急响应-系统排查
在网络安全应急响应中,系统排查是快速识别潜在威胁的关键步骤。以下是针对Windows和Linux系统的系统基本信息排查指南,涵盖常用命令及注意事项: 一、Windows系统排查 1. 系统信息工具(msinfo32.exe) 命令执行&#x…...
[QMT量化交易小白入门]-四十二、五年年化收益率26%,当日未成交的下单,取消后重新委托
本专栏主要是介绍QMT的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写100篇左右。 QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步。 文章目录 相关阅读委托查询功能3.1 数据获取层3.2 数据结构初始…...
Windows版-RabbitMQ自动化部署
一键完成Erlang环境变量配置(ERLANG_HOME系统变量) 一键完成RabbitMQ环境变量配置(RabbitMQ系统变量) 实现快速安装部署RabbitMQ PS: 需提前下载安装: - otp_win64_25.0.exe (Erlang) - rabbit…...
openEuler24.03 LTS下安装Flink
目录 Flink的安装模式下载Flink安装Local模式前提条件解压安装包启动集群查看进程提交作业文件WordCount持续流WordCount 查看Web UI配置flink-conf.yaml简单使用 关闭集群 Standalone Session模式前提条件Flink集群规划解压安装包配置flink配置flink-conf.yaml配置workers配置…...
LeetCode热题100记录-【二分查找】
二分查找 35.搜索插入位置 思考:二分查找先判定边界条件 记录:不需要二刷 class Solution {public int searchInsert(int[] nums, int target) {int left 0,right nums.length-1;if(nums[right] < target){return right1;}if(nums[left] > tar…...
从零开始学java--泛型(1)
泛型 学生成绩可能是数字类型,也可能是字符串类型,如何存放可能出现的两种类型呢: public class Score {String name;String id;Object value; //因为Object是所有类型的父类,因此既可以存放Integer也能存放Stringpublic Score…...
【正点原子】STM32MP135去除SD卡引脚复用,出现 /dev/mmcblk1p5 not found!
如果在设备树中直接注释掉 sdmmc1 节点,就会导致系统启动时识别不到真正的 eMMC 设备,进而挂载失败,爆出 /dev/mmcblk1p5 not found 的问题。 正点原子STM32MP135开发板Linux核心板嵌入式ARM双千兆以太网CAN 正确操作是“放空”而不是“删光…...
CrystalDiskInfo电脑硬盘监控工具 v9.6.0中文绿色便携版
前言 CrystalDiskInfo是一个不用花钱的硬盘小帮手软件,它可以帮你看看你的电脑硬盘工作得怎么样,健不健康。这个软件能显示硬盘的温度高不高、还有多少地方没用、传输东西快不快等等好多信息。用了它,你就能很容易地知道硬盘现在是什么情况&…...
详解模型蒸馏,破解DeepSeek性能谜题
大家好,不少关注 DeepSeek 最新动态的朋友,想必都遇到过 “Distillation”(蒸馏)这一术语。本文将介绍模型蒸馏技术的原理,同时借助 TensorFlow 框架中的实例进行详细演示。通过本文,对模型蒸馏有更深的认识…...
⭐算法OJ⭐数据流的中位数【最小堆】Find Median from Data Stream
最小堆 最小堆是一种特殊的完全二叉树数据结构。 基本定义 堆性质:每个节点的值都小于或等于其子节点的值(根节点是最小值)完全二叉树性质:除了最底层外,其他层的节点都是满的,且最底层的节点都靠左排列…...
园区网拓扑作业
作业要求: 需求: 需求分析: 1.按照图示的VLAN及IP地址需求,完成相关配需:VLAN 2、3、20、30 已分配子网,需在交换机上创建 VLAN 并配置三层接口作为网关。确保各 VLAN 内设备能互通,跨 VLAN 通…...
隔行换色总结
功能效果展示: 第一种思路: 使用数组,将数组的内容渲染到页面上,序号也就是将数组的下标输出到第一个td上,将数组的内容输出到第二个td上,(使用拼接字符串) 具体操作: …...
使用Docker Desktop进行本地打包和推送
使用Docker Desktop进行本地打包和推送 一、Docker Desktop配置二、IDEA配置1.下载Docker插件2.在“Settings”中,配置“Docker”3.选择“Docker Registry”,配置远程仓库。 三、POM配置 一共有三个地方需要配置 一、Docker Desktop配置 在Docker Deskt…...
MTO和MTS不同模式制造业数字化转型的“三座大山“:MES/ERP/PLM系统集成技术全解析
1.导言:制造业的数字化转型与集成系统的作用 在工业4.0浪潮的推动下,制造业正处于深刻的数字化转型之中。这场变革的核心在于利用先进技术,如物联网(IoT)、人工智能(AI)、大数据分析和云计算&a…...
Redis主从复制:告别单身Redis!
目录 一、 为什么需要主从复制?🤔二、 如何搭建主从架构?前提条件✅步骤📁 创建工作目录📜 创建 Docker Compose 配置文件🚀 启动所有 Redis🔍 验证主从状态 💡 重要提示和后续改进 …...
数据库管理工具实战:IDEA 与 DBeaver 连接 TDengine(二)
五、DBeaver 连接 TDengine 实战 5.1 安装 DBeaver 下载安装包:访问 DBeaver 官方网站(https://dbeaver.io/download/ ),根据你的操作系统选择合适的安装包。如果是 Windows 系统,下载.exe 格式的安装文件࿱…...
ORM、Mybatis和Hibernate、Mybatis使用教程、parameterType、resultType、级联查询案例、resultMap映射
DAY21.1 Java核心基础 ORM Object Relationship Mapping 对象关系映射 面向对象的程序到—关系型数据库的映射 比如java – MySQL的映射 ORM框架就是实现这个映射的框架 Hibernate、Mybatis、MybatisPlus、Spring Data JPA、Spring JDBC Spring Data JPA的底层就是Hiber…...
简历EasyExcel相关
系列博客目录 文章目录 系列博客目录1.在easyExcel的基础上,应用多线程对数据进行分块有用吗为什么使用多线程对数据进行分块有用?实现方式示例:多线程与 EasyExcel 导出结合的基本思路解释:注意事项:总结:…...
C#调用Lua方法1+C#调用Lua方法2,3
xLua中Lua调用C#代码 原因:C#实现的系统,因为Lua可以调用,所以完全可以换成Lua实现,因为Lua可以即时更改,即时运行,所以游戏的代码逻辑就可以随时更改。 实现和C#相同效果的系统,如何实现&#…...
stable diffusion 量化加速点
文章目录 一、导出为dynamic shape1)函数讲解(函数导出、输出检查)2)代码展示二、导出为static shape1)函数讲解(略)2)代码展示三、序列化为FP32测速1)测速2)代码四、序列化为FP16测速1)测速2)代码同上五、发现并解决解决CLIP FP16溢出,并测速1)如何找到溢出的算子…...
NO.77十六届蓝桥杯备战|数据结构-单调队列|质量检测(C++)
什么是单调队列? 单调队列,顾名思义,就是存储的元素要么单调递增要么单调递减的队列。注意,这⾥的队列和普通的队列不⼀样,是⼀个双端队列。单调队列解决的问题 ⼀般⽤于解决滑动窗⼝内最⼤值最⼩值问题,以…...
通过发票四要素信息核验增值税发票真伪-iOS发票查验接口
发票是企业经济间往来的重要凭证,现如今,随着经济环境的日益复杂,发票造假现象屡禁不止,这使得增值税发票查验成为企业必须高度重视的工作。人工智能时代,发票查验接口犹如一道坚固的防线,助力企业财务守护…...
区块链是怎么存储块怎么找到前一个块
前言:学习区块链的过程中在想怎么管理区块链呢 📌 推荐项目回顾: 👉 Jeiwan 的 blockchain_go 项目 GitHub 地址:https://github.com/Jeiwan/blockchain_go ❓它是怎么存储区块 & 找前一个区块的? 项…...
超详解glusterfs部署
glusterfs部署 GlusterFS 是一个开源的分布式文件系统,旨在提供高性能、高可用性和可扩展性,适用于存储大量数据。它通过将多个存储节点组合成一个统一的文件系统,允许用户透明地访问分布在不同节点上的数据。 主要组件 存储砖块ÿ…...
总结一下常见的EasyExcel面试题
说一下你了解的POI和EasyExcel POI(Poor Obfuscation Implementation):它是 Apache 软件基金会的一个开源项目,为 Java 程序提供了读写 Microsoft Office 格式文件的功能,支持如 Excel、Word、PowerPoint 等多种文件格…...
【JAVA】十、基础知识“类和对象”干货分享~(三)
目录 1. 封装 1.1 封装的概念 1.2 访问限定符 public(公开访问) private(私有访问) 1.3 包 1.3.1 包的概念 1.3.2 导入包中的类 1.3.3 自定义包 2. static成员 2.1 static变量(类变量) 2.1.1 sta…...
DeepSeek+SpringAI家庭AI医生
文章目录 项目架构项目开发内容项目用户用例图项目地址开发环境大模型使用本地:Ollama部署DeepSeek离线与在线api大模型客户端使用 数据库脚本代码deepseek创建定制医生模型 内网互通原则云服务器类型 项目架构 项目开发内容 项目用户用例图 项目地址 FamilyAIDoct…...
PyTorch:解锁AI新时代的钥匙
(前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站)。 揭开PyTorch面纱 对于许多刚开始接触人工智能领域的朋友来说,PyTorch这个名字或许既熟悉又陌生。…...
C++第14届蓝桥杯b组学习笔记
1. 日期统计 小蓝现在有一个长度为 100100 的数组,数组中的每个元素的值都在 00 到 99 的范围之内。数组中的元素从左至右如下所示: 5 6 8 6 9 1 6 1 2 4 9 1 9 8 2 3 6 4 7 7 5 9 5 0 3 8 7 5 8 1 5 8 6 1 8 3 0 3 7 9 2 7 0 5 8 8 5 7 0 9 9 1 9 4 4…...
