winform datagridview 勾选复选框 和点击单元格事件区分

news/2025/2/24 1:31:48/文章来源:https://www.cnblogs.com/renzhituteng/p/18733192
winform datagridview 勾选复选框 和点击单元格事件区分

在Windows Forms的DataGridView控件中,同时处理复选框的勾选事件和单元格点击事件可能会遇到一些问题,因为这两个事件的处理方式略有不同。默认情况下,当在DataGridView中点击一个单元格时,如果该单元格旁边有复选框列,复选框的状态可能会改变(勾选或取消勾选),这会导致混淆,因为我们可能希望区分这两种情况。

要区分这两种情况,你可以采用以下几种方法:

1. 使用CellClick事件来区分

你可以通过检查事件参数来判断是点击了复选框还是普通单元格。对于复选框列,你可以在CellClick事件中检查点击的单元格是否属于复选框列,并据此决定是否处理复选框的勾选。

private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{if (e.ColumnIndex >= 0) // 确保是有效的列索引{// 检查是否点击的是复选框列if (dataGridView1.Columns[e.ColumnIndex] is DataGridViewCheckBoxColumn){// 处理复选框点击事件MessageBox.Show("复选框被点击");}else{// 处理普通单元格点击事件MessageBox.Show("普通单元格被点击");}}
}

  

2. 使用CellContentClick事件专门处理复选框点击

对于复选框列,你可以专门使用CellContentClick事件来处理复选框的点击事件,而将普通单元格的点击留给CellClickCellMouseClick事件。

private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{if (e.ColumnIndex >= 0 && dataGridView1.Columns[e.ColumnIndex] is DataGridViewCheckBoxColumn){// 处理复选框点击事件MessageBox.Show("复选框被点击");}
}

 

3. 使用CellMouseClick事件区分点击位置

如果你想要更精确地控制鼠标点击的位置(例如,区分点击了复选框本身与单元格的其他部分),可以使用CellMouseClick事件。在这个事件中,你可以检查鼠标点击的位置是否正好位于复选框区域内。

private void dataGridView1_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{Rectangle cellBounds = dataGridView1.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, false); // 获取单元格的显示区域Point mousePos = dataGridView1.PointToClient(Cursor.Position); // 获取鼠标在DataGridView中的位置mousePos = new Point(mousePos.X - cellBounds.Left, mousePos.Y - cellBounds.Top); // 转换为单元格内的相对位置if (dataGridView1.Columns[e.ColumnIndex] is DataGridViewCheckBoxColumn){// 检查鼠标位置是否在复选框区域内(通常需要额外的逻辑来精确判断)// 由于DataGridView的绘制机制,直接判断可能比较复杂,可能需要自定义绘制或使用第三方库帮助判断// 这里可以添加更复杂的逻辑来判断鼠标是否确实点击了复选框的特定区域}else if (cellBounds.Contains(mousePos)) // 确认鼠标确实点击了单元格的其他部分(非复选框){// 处理普通单元格点击事件MessageBox.Show("普通单元格被点击");}
}

  

注意:直接在CellMouseClick中精确判断鼠标是否点击了复选框本身通常比较困难,因为DataGridView的绘制机制和控件的布局使得直接判断变得复杂。如果需要精确控制,可以考虑自定义绘制复选框或者在绘制时记录额外的信息。

结论

通常,使用CellContentClick事件专门处理复选框的点击是最简单和最直接的方法。对于普通单元格的点击,可以继续使用CellClickCellMouseClick事件。这样可以有效地区分和处理这两种不同的事件类型。

 

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/888642.html

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

相关文章

dokcer-compose方式部署 mongo集群

声明:本人在单台机器上部署的mongo机器, mongo版本为8.0, 这玩意居然部署了一天,终于搞好了, 希望对后面想要部署的人有帮助 先创建一个mongodb目录, 后续的配置,数据都存放在这个目录中: 1. 创建mongo-secrets目录,mkdir mongo-secrets 2. 创建keyfile文件, openssl…

两个终端小玩具:Yazi和elinks

1. 终端文件管理器yazi 可以很方便地查找文件,跳转,并且很容易看出文件 1.1 下载安装 参考官方地址:鸭子官方安装手册安装rust编译环境curl --proto =https --tlsv1.2 -sSf https://sh.rustup.rs | sh rustup update编译yazigit clone https://github.com/sxyazi/yazi.git c…

两个终端小玩具

1. 终端浏览器 1.1 m3w 1.2 elinks 2. 终端文件管理器yazi 可以很方便地查找文件,跳转,并且很容易看出文件 2.1 下载安装 参考官方地址:鸭子官方安装手册安装rust编译环境curl --proto =https --tlsv1.2 -sSf https://sh.rustup.rs | sh rustup update编译yazigit clone htt…

用大模型DeepSeek分析一篇小公司创业失败的文章,失败的原因有哪些?

第一步:把原文保存为Doc格式文档 原本我想直接让 DeepSeek 分析链接的文章,但是两次写提示词后让 DeepSeek 深度分析,都失败了,它说无法直接访问,所以就无法直接分析原文内容。但还是基于搜索的结果进行普遍原因分析。 于是就把原文直接保存为 Doc,上传到 DeepSeek 让它分…

Markdowm学习

标题 二级标题 三级标题 四级标题 五级标题 六级标题 (#*n+空格+标题内容+回车——n级标题 注:此方法最多为六级标题) 字体样式 Hello World (两边加**为粗体) Hello World (两边加*为斜体) Hello World (两边加***为粗体+斜体) Hello World (两边加~~为删除线) 引用h…

区块链模型原理入门学习2——细化模型

以上描述中,存在一些非生产情景的理想化设定。比如:1.没有设计谜题难度平衡 2.没有加入加密校验数字签证 3.没有设计个人钱包 4.广播问题【敬畏能量 敬畏自然】

upload-labs/Pass-12 白名单检测 - %00 截断 GET

save_path 为客户端向服务器端传递的额外信息,可能用此参数指定上传文件的保存目录将save_path 更改为../upload/test.php%00 filename=test.png,filename 的后缀名需要满足白名单 路径和文件名组合在一起会变成../upload/test.php%00test.png , 后缀名满足白名单那么文件就…

upload-labs/Pass-13 白名单检测 - %00 截断 POST

POST 数据包的路径在请求体中在请求体中添加文件名称test.php, 但是不能像GET请求的数据包一样直接添加%00 了,我们需要直接在hex 中将标记修改为00;同时记得把文件名修改为可以上传的后缀重放数据包即可成功绕过上传

upload-labs/Pass-14 Pass-15 图片码绕过

copy .\test.png/b+.\test.php/a kb.png /b:以二进制模式 读取文件 .\test.png /b:以二进制读取test.png /a:以 ASCII 文本模式 读取文件,遇到第一个 EOF(文件结束符,如 0x1A)时停止读取。 .\as.php /a:以 ASCII 文本模式 读取as.php +:表示合并操作,将多个文件内容拼…

upload-labs/Pass-07 黑名单检测 -空格绕过

代码中没有对文件左右两侧去除空格,在文件名后面添加空格不影响文件执行,因此可以绕过

upload-labs/Pass-06 黑名单检测 - 后缀大小写绕过

利用Windows对大小写不敏感的特性。代码中没有对文件大小写做归一,更改文件后缀名大小写可以绕过黑名单

upload-labs/Pass-05 Pass-10 黑名单检测 - 点空格点绕过

利用Windows系统的文件名特性,会自动去掉后缀名最后的.,上传 as.php..进行绕过。 在Windows系统下命名test.php. . ; 命名成功后显示的文件名称为test.php在BP 中更改文件名,文件上传成功访问文件成功 3. 代码分析:删除文件名最后的点之后,以字符串最后的点为分界线,点之…