Winform中DatagridView 表头实现一个加上一个checkBox,实现全选选项功能
实现效果
点击checkBox1或者直接在第一列列表头点击即可实现

代码实现
我的datagridview叫dgv

我在datagridview已经默认添加了一个DataGridViewCheckBoxColumn,勾选时value为1,不勾选时value为0

第一种通过可视化拖动一个checkBox来实现
拖动组件,然后绑定事件

点击事件


事件代码:
/// <summary>/// checkbox1的点击事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void checkSelectAll_CheckedChanged(object sender, EventArgs e){if (checkSelectAll.Checked){foreach (DataGridViewRow dgvRow in this.dgv.Rows){dgvRow.Cells["dataGridViewCheckBoxColumn1"].Value = true;}}else{foreach (DataGridViewRow dgvRow in this.dgv.Rows){dgvRow.Cells["dataGridViewCheckBoxColumn1"].Value = false;}}}
第二种,自定义checkBox,添加到列头
这种需要自己弄一个DataGridViewCheckBoxColumn
文件位置

详细代码:
==DatagridviewCheckboxHeaderCell ==
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using WindowsFormsApp20230728.Properties;namespace WindowsFormsApp20230728
{//定义触发单击事件的委托public delegate void DatagridviewcheckboxHeaderEventHander(object sender, DatagridviewCheckboxHeaderEventArgs e);//定义继承于DataGridViewColumnHeaderCell的类,用于绘制checkbox,定义checkbox鼠标单击事件public class DatagridviewCheckboxHeaderCell : DataGridViewColumnHeaderCell{Point checkBoxLocation;Size checkBoxSize;bool _checked = false;Point _cellLocation = new Point();System.Windows.Forms.VisualStyles.CheckBoxState _cbState = System.Windows.Forms.VisualStyles.CheckBoxState.UncheckedNormal;public event DatagridviewcheckboxHeaderEventHander OnCheckBoxClicked;//绘制列头checkboxprotected override void Paint(System.Drawing.Graphics graphics,System.Drawing.Rectangle clipBounds,System.Drawing.Rectangle cellBounds,int rowIndex,DataGridViewElementStates dataGridViewElementState,object value,object formattedValue,string errorText,DataGridViewCellStyle cellStyle,DataGridViewAdvancedBorderStyle advancedBorderStyle,DataGridViewPaintParts paintParts){base.Paint(graphics, clipBounds, cellBounds, rowIndex,dataGridViewElementState, value,formattedValue, errorText, cellStyle,advancedBorderStyle, paintParts);Point p = new Point();Size s = CheckBoxRenderer.GetGlyphSize(graphics,System.Windows.Forms.VisualStyles.CheckBoxState.UncheckedNormal);p.X = cellBounds.Location.X +(cellBounds.Width / 2) - (s.Width / 2) - 1;//列头checkbox的X坐标p.Y = cellBounds.Location.Y +(cellBounds.Height / 2) - (s.Height / 2);//列头checkbox的Y坐标_cellLocation = cellBounds.Location;checkBoxLocation = p;checkBoxSize = s;if (_checked)_cbState = System.Windows.Forms.VisualStyles.CheckBoxState.CheckedNormal;else_cbState = System.Windows.Forms.VisualStyles.CheckBoxState.UncheckedNormal;CheckBoxRenderer.DrawCheckBox(graphics, checkBoxLocation, _cbState);}/// <summary>/// 点击列头checkbox单击事件/// </summary>protected override void OnMouseClick(DataGridViewCellMouseEventArgs e){var p = new Point(e.X + _cellLocation.X, e.Y + _cellLocation.Y);if (p.X >= checkBoxLocation.X && p.X <= checkBoxLocation.X + checkBoxSize.Width&& p.Y >= checkBoxLocation.Y && p.Y <= checkBoxLocation.Y + checkBoxSize.Height){_checked = !_checked;//获取列头checkbox的选择状态DatagridviewCheckboxHeaderEventArgs ex = new DatagridviewCheckboxHeaderEventArgs { CheckedState = _checked };var sender = new object();//此处不代表选择的列头checkbox,只是作为参数传递。应该列头checkbox是绘制出来的,无法获得它的实例if (OnCheckBoxClicked != null){OnCheckBoxClicked(sender, ex);//触发单击事件this.DataGridView.InvalidateCell(this);}}base.OnMouseClick(e);}}
}
==DatagridviewCheckboxHeaderEventArgs ==
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;namespace WindowsFormsApp20230728
{//定义包含列头checkbox选择状态的参数类public class DatagridviewCheckboxHeaderEventArgs : EventArgs{public DatagridviewCheckboxHeaderEventArgs(){CheckedState = false;}public bool CheckedState{get { return _CheckedState; }set { _CheckedState = value; }}private bool _CheckedState;}
}
实现位置,均在Form2类中


代码:
public Form2(){InitializeComponent();//InitColumnInfo();#region 自定义组件开始//自定义组件实现var ch = new DatagridviewCheckboxHeaderCell();ch.OnCheckBoxClicked += new DatagridviewcheckboxHeaderEventHander(ch_OnCheckBoxClicked);var checkboxCol = this.dgv.Columns[0] as DataGridViewCheckBoxColumn;checkboxCol.HeaderCell = ch;checkboxCol.HeaderCell.Value = string.Empty;}
注意其中dgv.EndEdit(); 失去焦点操作,如果没有这个,你焦点所在checkBox不会勾选
//去除datagridview列表头排序// foreach (DataGridViewColumn item in dgv.Columns)// item.SortMode = DataGridViewColumnSortMode.NotSortable;/// <summary>/// 单击事件/// </summary>private void ch_OnCheckBoxClicked(object sender, DatagridviewCheckboxHeaderEventArgs e){//失去焦点操作dgv.EndEdit();//Console.WriteLine(e.CheckedState.ToString());//选中事件操作if (e.CheckedState){for(int i = 0; i < dgv.Rows.Count; i++){dgv.Rows[i].Cells[0].Value = 1;}//foreach (DataGridViewRow dgvRow in this.dgv.Rows)//{// dgvRow.Cells["dataGridViewCheckBoxColumn1"].Value = true;//}}else{for (int i = 0; i < dgv.Rows.Count; i++){dgv.Rows[i].Cells[0].Value = 0;}//foreach (DataGridViewRow dgvRow in this.dgv.Rows)//{// dgvRow.Cells["dataGridViewCheckBoxColumn1"].Value = 0;//}}}
第三种,不添加DataGridViewCheckBoxColumn,直接以自定义的形式形成一列的checkBox
和第二种相比,就是把DataGridViewCheckBoxColumn从DataGridView中删除,然后public Form2()自定义组件实现代码改一下,其他都是一样的
也就是把这一串换成下面的即可
//自定义组件实现
var ch = new DatagridviewCheckboxHeaderCell();
ch.OnCheckBoxClicked += new DatagridviewcheckboxHeaderEventHander(ch_OnCheckBoxClicked);
var checkboxCol = this.dgv.Columns[0] as DataGridViewCheckBoxColumn;
checkboxCol.HeaderCell = ch;
checkboxCol.HeaderCell.Value = string.Empty;
if (!this.DesignMode){DatagridviewCheckboxHeaderCell cbHeader = new DatagridviewCheckboxHeaderCell();cbHeader.OnCheckBoxClicked += new DatagridviewcheckboxHeaderEventHander(ch_OnCheckBoxClicked);DataGridViewCheckBoxColumn checkboxCol = new DataGridViewCheckBoxColumn();checkboxCol.HeaderCell = cbHeader;checkboxCol.HeaderCell.Value = string.Empty;this.dgv.Columns.Insert(0,checkboxCol);
}
第三种实现的是类属于java面向对象编程的效果,第二种则是自定义组件进行添加的效果
参考文章
C# Winform中DataGridView的DataGridViewCheckBoxColumn CheckBox选中判断
关于Winform中DatagridView 表头checkBox全选选项框总结
DataGridView EndEdit()方法
c# winform获取gridview数据
精髓概括
C# 自定义控件实现ChackBox的Checked效果
-
创建一个类,继承自System.Windows.Forms.Control,实现自定义控件;
-
在类中重写OnPaint方法,绘制CheckBox的外观;
-
在类中重写OnMouseDown方法,实现鼠标点击时CheckBox的Checked状态的改变;
-
在类中定义一个Checked属性,用于获取或设置CheckBox的Checked状态;
-
在类中定义一个CheckedChanged事件,用于在CheckBox的Checked状态改变时触发;
-
在类中重写OnClick方法,实现CheckBox的Checked状态改变时触发CheckedChanged事件。
配套功能实现
Winform中DatagridView 加上 ContextMenuStrip 实现右键点击展示菜单,且可以获取数据(在没数据的地方不显示右键菜单,以及右键焦点进行改变),详情见该栏上一篇文章
相关文章:
Winform中DatagridView 表头实现一个加上一个checkBox,实现全选选项功能
实现效果 点击checkBox1或者直接在第一列列表头点击即可实现 代码实现 我的datagridview叫dgv 我在datagridview已经默认添加了一个DataGridViewCheckBoxColumn,勾选时value为1,不勾选时value为0 第一种通过可视化拖动一个checkBox来实现 拖动组…...
rust基础
这是笔者学习rust的学习笔记(如有谬误,请君轻喷) 参考视频: https://www.bilibili.com/video/BV1hp4y1k7SV参考书籍:rust程序设计语言:https://rust.bootcss.com/title-page.htmlmarkdown地址:h…...
剑指offer39.数组中出现次数超过一半的数字
这个题非常简单,解法有很多种,我用的是HashMap记录每个元素出现的次数,只要次数大于数组长度的一半就返回。下面是我的代码: class Solution {public int majorityElement(int[] nums) {int len nums.length/2;HashMap<Integ…...
spring技术栈面试题
1 Spring支持的事务管理类型有哪些?你在项目中使用哪种方式? Spring支持两种类型的事务管理: 编程式事务管理:这意味你通过编程的方式管理事务,给你带来极大的灵活性,但是难维护。声明式事务管理&#x…...
Android Glide MemorySizeCalculator计算值,Kotlin
Android Glide MemorySizeCalculator计算值,Kotlin for (i in 100..1000 step 50) {val calculator MemorySizeCalculator.Builder(this).setMemoryCacheScreens(i.toFloat()).setBitmapPoolScreens(i.toFloat()).setMaxSizeMultiplier(0.8f).setLowMemoryMaxSizeMultiplier(0…...
KEIL自带的Jlink怎么升级更换版本
问题背景 V4.20以上的keil安装包中都自带Jlink驱动包,即当你安装了KEIL后,Debug或Download就是用的安装KEIL时附带安装的Jlink版本。 那如果存在这种情况,你正在开发的芯片比较新,只有比较新的Jlink驱动软件才能支持,…...
图的遍历之 深度优先搜索和广度优先搜索
深度优先搜索的图文介绍 1. 深度优先搜索介绍 图的深度优先搜索(Depth First Search),和树的先序遍历比较类似。 它的思想:假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点,然后依次从它的各…...
Java学习笔记27——file类
File类 概述和构造方法概述构造方法 File的创建功能File类判断和获取功能File的删除功能 概述和构造方法 概述 在java.io下 具体的类 file是文件和目录路径名的抽象表示 文件和目录是可以封装成对象的对于file而言,其封装的并不是真正存在的文件(可以…...
细胞——求细胞数量 C++详解
细胞——求细胞数量 C详解 求细胞数量题目描述输入格式输出格式样例样例输入样例输出 提示数据规模与约定 解法代码 求细胞数量 题目描述 一矩形阵列由数字 0 0 0 到 9 9 9 组成,数字 1 1 1 到 9 9 9 代表细胞,细胞的定义为沿细胞数字上下左右若还…...
【计算机视觉】关于图像处理的一些基本操作
目录 图像平滑滤波处理均值滤波计算过程python实现 高斯滤波计算过程python实现 中值滤波计算过程python实现 图像的边缘检测Robert算子计算过程python实现 图像处理腐蚀算子计算过程python实现 Hog(梯度方向直方图)特征计算流程:Hog的特征维…...
Android Animation Made Easy
原文链接 Android Animation Made Easy 动画在任何一个GUI系统中都是一个非常重要的设计元素,它可以让交互变得优雅,让界面变得炫酷,让操作变得更加的舒畅,让状态过渡变得更加的顺滑,对视觉效果有极大的提升ÿ…...
56从零开始学Java之与字符串相关的正则表达式
作者:孙玉昌,昵称【一一哥】,另外【壹壹哥】也是我哦 千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者 前言 在上一篇文章中,壹哥给大家介绍了String字符串及其各种常用API方法,接下来壹哥…...
STM32 定时器自动重装载寄存器ARR带来的影响,ARPE0和1区别
ARR是啥 自动重载寄存器是预装载的。对自动重载寄存器执行写入或读取操作时会访问预装载寄存器。预装载寄存器的内容既可以直接传送到影子寄存器,也可以在每次发生更新事件 (UEV) 时传送到影子寄存器,这取决于 TIMx_CR1 寄存器中的自动重载预装载使能位 …...
vue 把<style scoped lang=“less“> 单独写成less文件再导入使用
1 npm npm install less-loader --save-dev2 创建一个单独的 Less 文件,例如 app.less <style scoped lang"less"> import url(./app.less); </style>3 在 app.less 文件中,编写 Less 样式代码 .container {width: 500px;margi…...
C++ 字符串
C 字符串 一、字符串两种写法 c语言的写法,可以延用 const char* str1 "huang"; char str2[] "Hello, World!";c写法 std::string str "Hello, World!";二、字符串计算长度 c语言的计算字符串长度,需要导入库 #inc…...
springboot 报错处理(长期更新 2023.8.10)
目录 一、HTTP 相关1.1、 数据传输方面1.1.1、 HttpMessageNotWritableException1.1.1.1、 springboot + stomp 场景一、HTTP 相关 1.1、 数据传输方面 1.1.1、 HttpMessageNotWritableException 1.1.1.1、 springboot + stomp 场景 报错内容: 使用 spring boot 和 stomp 服…...
Maven出现报错 ; Unable to import maven project: See logs for details错误的多种解决方法
问题现象; IDEA版本: Maven 版本 : 3.3.9 0.检查 maven 的设置 :F:\softeware\maven\apache-maven-3.9.3\conf 检查setting.xml 配置 本地仓库<localRepository>F:\softeware\maven\local\repository</localRepository>镜像…...
33_windows环境debug Nginx 源码-安装WSL
文章目录 前言安装 WSL先决条件启用 windows 更新功能真正安装 WSL133_windows环境debug Nginx 源码-安装WSL前言 虽然很想在纯 windows 环境,基于windows 的生态完成debug,但现实情况是 由于Nginx 源码编写的很多内容都和 linux 更加耦合;且不说使用 Visual-Studio 安装 C/…...
Java中的ZooKeeper是什么?
Java中的ZooKeeper是一个开源的分布式协调服务,它可以帮助我们管理分布式系统中的数据和配置信息。ZooKeeper是由Facebook开发的一个开源项目,它被广泛用于Facebook的分布式系统。 ZooKeeper的名称来源于动物园管理员(Zookeeper)…...
【数学】CF1796 C
Problem - 1796C - Codeforces 题意: 思路: 模拟一下样例可以发现一些规律 Code: #include <bits/stdc.h>#define int long longusing i64 long long;constexpr int N 1e6 10; constexpr int mod 998244353;void solve() {int l…...
深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...
