winfrom 操作列 动态按钮

news/2025/11/24 20:56:26/文章来源:https://www.cnblogs.com/mofale/p/19265789
public partial class Form1 : Form
{public Form1(){InitializeComponent();// 绑定事件this.dataGridView1.CellPainting += DataGridView1_CellPainting;this.dataGridView1.CellClick += DataGridView1_CellClick;}private void Form1_Load(object sender, EventArgs e){// 添加三列dataGridView1.Columns.Add("first", "First");dataGridView1.Columns.Add("second", "Second");dataGridView1.Columns.Add("third", "操作"); // 这一列我们将自绘按钮dataGridView1.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;// 添加15行示例数据for (int i = 0; i < 15; i++){string first = $"Row{i}";string second = i % 2 == 0 ? "Even" : "Odd";dataGridView1.Rows.Add(first, second, ""); // 第三列留空,由我们绘制}// 设置第三列不可编辑、居中等var opCol = dataGridView1.Columns["third"];opCol.ReadOnly = true;opCol.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;}// 判断某行是否应显示操作按钮private bool ShouldShowButtonsInRow(int rowIndex){if (rowIndex < 0 || rowIndex >= dataGridView1.Rows.Count) return false;var cellValue = dataGridView1.Rows[rowIndex].Cells["second"].Value?.ToString();return cellValue == "Even"; // 示例条件:第二列为 "Even"}// 定义操作列的左右边距(可调整)private const int OperationColumnPaddingLeft = 6;private const int OperationColumnPaddingRight = 6;private const int OperationColumnPaddingTop = 3;private const int OperationColumnPaddingBottom = 3;private const int ButtonSpacing = 10; // 按钮间的间距// 绘制虚拟按钮(带左右空白和按钮间间距)private void DataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e){if (e.ColumnIndex == dataGridView1.Columns["third"].Index && e.RowIndex >= 0){e.PaintBackground(e.ClipBounds, true);if (!ShouldShowButtonsInRow(e.RowIndex)){e.Handled = true;return;}Rectangle cellRect = e.CellBounds;// 计算总可用宽度(减去左右边距和按钮间间距)int usableWidth = cellRect.Width - OperationColumnPaddingLeft - OperationColumnPaddingRight - ButtonSpacing;// 计算单个按钮的实际宽度int btnWidth = usableWidth / 2;Rectangle btn1Rect = new Rectangle(cellRect.Left + OperationColumnPaddingLeft,cellRect.Top + OperationColumnPaddingTop,btnWidth,cellRect.Height - OperationColumnPaddingTop - OperationColumnPaddingBottom);Rectangle btn2Rect = new Rectangle(cellRect.Left + OperationColumnPaddingLeft + btnWidth + ButtonSpacing,cellRect.Top + OperationColumnPaddingTop,btnWidth,cellRect.Height - OperationColumnPaddingTop - OperationColumnPaddingBottom);using (SolidBrush brush = new SolidBrush(SystemColors.Control))using (Pen pen = new Pen(SystemColors.ControlDark)){e.Graphics.FillRectangle(brush, btn1Rect);e.Graphics.DrawRectangle(pen, btn1Rect.X, btn1Rect.Y, btn1Rect.Width - 1, btn1Rect.Height - 1);e.Graphics.FillRectangle(brush, btn2Rect);e.Graphics.DrawRectangle(pen, btn2Rect.X, btn2Rect.Y, btn2Rect.Width - 1, btn2Rect.Height - 1);}TextRenderer.DrawText(e.Graphics, "操作1", dataGridView1.Font, btn1Rect, SystemColors.ControlText,TextFormatFlags.HorizontalCenter | TextFormatFlags.VerticalCenter | TextFormatFlags.EndEllipsis);TextRenderer.DrawText(e.Graphics, "操作2", dataGridView1.Font, btn2Rect, SystemColors.ControlText,TextFormatFlags.HorizontalCenter | TextFormatFlags.VerticalCenter | TextFormatFlags.EndEllipsis);e.Handled = true;}}// 处理点击(同样应用相同边距和间距)private void DataGridView1_CellClick(object sender, DataGridViewCellEventArgs e){if (e.ColumnIndex == dataGridView1.Columns["third"].Index && e.RowIndex >= 0){if (!ShouldShowButtonsInRow(e.RowIndex)) return;DataGridView dgv = sender as DataGridView;Rectangle cellRect = dgv.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, false);int usableWidth = cellRect.Width - OperationColumnPaddingLeft - OperationColumnPaddingRight - ButtonSpacing;int btnWidth = usableWidth / 2;Rectangle btn1Rect = new Rectangle(cellRect.Left + OperationColumnPaddingLeft,cellRect.Top + OperationColumnPaddingTop,btnWidth,cellRect.Height - OperationColumnPaddingTop - OperationColumnPaddingBottom);Rectangle btn2Rect = new Rectangle(cellRect.Left + OperationColumnPaddingLeft + btnWidth + ButtonSpacing,cellRect.Top + OperationColumnPaddingTop,btnWidth,cellRect.Height - OperationColumnPaddingTop - OperationColumnPaddingBottom);Point clickPoint = dgv.PointToClient(Cursor.Position);if (btn1Rect.Contains(clickPoint)){MessageBox.Show($"操作1 被点击(行 {e.RowIndex})");}else if (btn2Rect.Contains(clickPoint)){MessageBox.Show($"操作2 被点击(行 {e.RowIndex})");}}}
}

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

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

相关文章

蓝桥杯-Python-基础语法

蓝桥杯-Python-基础语法上周开始了蓝桥杯python算法课程的学习,前几部分都是python算法基础,无非是一些加减乘除的运算,但还是需要牢记。在这里总结一些我自己容易遗忘或记错的语法。 一. 算数运算符加 两个对…

电脑重启后WiFi服务没有启动导致WiFi无法开启

计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Wcmsvc 双击"DependOnService" 删除其中的WinHttpAutoProxySvc,点击确定。 重启电脑

大盘风险控制策略分析报告 - 2025年11月24日 - 20:51:47

大盘风险控制策略分析报告 - 2025年11月24日body { font-family: "Microsoft YaHei", "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; line-height: 1.6; color: rgba(51, 51, 51, 1); max-wi…

Oracle 数据库体系结构详解

Oracle 数据库体系结构详解一、SGA 相关概念 SGA,全称为 “System Global Area”(系统全局区),是 Oracle 为实例分配的一组共享缓冲存储区,主要用于存放数据库数据和控制信息,供数据库进程共享(PGA 不可共享),…

LRU缓存-leetcode

题目描述 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类:LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存 int get(int key) 如果关键字 key 存在于缓存中…

总结-esp-idf 接口与抽象层设计

疑惑esp-idf中 lcd、io、bus 像是 spi_bus 和 spi_io 不都是配套出现的吗?那为啥还要分层呢...总结 抽象分层核心思想:分层不是为了拆分,是为了抽象 + 可组合ESP-IDF 的 esp_lcd 框架分为三个层级:BUS 层(硬件接口…

洛谷-训练题-算法1-2

洛谷-训练题-算法1-2$(".postTitle2").removeClass("postTitle2").addClass("singleposttitle");P1271 【深基9.例1】选举学生会 题目描述 学校正在选举学生会成员,有 n(1≤n≤999)名…

高性能AI股票预测分析报告 - 2025年11月24日 - 20:46:52

高性能AI股票预测分析报告 - 2025年11月24日body { font-family: "Microsoft YaHei", "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; line-height: 1.6; color: rgba(51, 51, 51, 1); max-wi…

兄弟们我是好

兄弟们我是好BbS.23bbb1.InFo/AuSt/2025_100.tmL BbS.23bbb1.InFo/AuSt/2025_101.tmL BbS.23bbb1.InFo/AuSt/2025_102.tmL BbS.23bbb1.InFo/AuSt/2025_103.tmL BbS.23bbb1.InFo/AuSt/2025_104.tmL BbS.23bbb1.InFo/AuS…

博客园真好用

博客园真好用zq.zhaopin.Com/moment/84854701 zq.zhaopin.Com/moment/84854705 zq.zhaopin.Com/moment/84854715 zq.zhaopin.Com/moment/84854708 zq.zhaopin.Com/moment/84854721 zq.zhaopin.Com/moment/84854720 zq.…

高性能AI股票预测分析报告 - 2025年11月24日 - 20:48:15

高性能AI股票预测分析报告 - 2025年11月24日body { font-family: "Microsoft YaHei", "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; line-height: 1.6; color: rgba(51, 51, 51, 1); max-wi…

肥东三中第19名 黄景行

肥东三中第19名 黄景行黄景行 七年级41班 是肥东三中第19名

增强AI股票预测分析报告 - 2025年11月24日 - 20:43:55

增强AI股票预测分析报告 - 2025年11月24日body { font-family: "Microsoft YaHei", "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; line-height: 1.6; color: rgba(51, 51, 51, 1); max-widt…

102302106-陈昭颖-第三次作业

作业1 实验一,爬取网站内所有图片 要求: 指定一个网站,爬取这个网站中的所有的所有图片,例如中国气象网(http://www.weather.com.cn)。实现单线程和多线程的方式爬取。 核心代码 def get_image_url(url, result_…

2025 年 11 月 GEO 公司推荐权威榜单:十大品牌价值内核与实战解决方案盘点

行业格局分析 根据中国信息通信研究院发布的2025年数字营销行业研究报告,全球GEO优化与AI智能优化服务市场规模预计达到520亿元,年增长率维持在18%以上。用户需求从单一平台优化转向跨AI生态的全域智能适配,企业对品…

2025 年 11 月 GEO 公司推荐权威榜单:十大品牌核心优势与定制化解决方案指南

一、行业格局分析 根据中国信通院发布的2024年数字营销行业发展报告,中国GEO优化服务市场规模达到85亿元,年增长率稳定在18%左右。随着生成式人工智能技术的快速发展,企业对于在AI搜索生态中构建品牌影响力的需求显…

NewStarCTF2024 Pwn Week2 Bad Asm

认真学习汇编语言很好的题,训练了我写shellcode的能力,同时做法也很巧妙。 .text:0000000000001230 ; __int64 __fastcall exec(__int64 (__fastcall *)(_QWORD, __int64, _QWORD, _Q…

增强AI股票预测分析报告 - 2025年11月24日 - 20:40:49

增强AI股票预测分析报告 - 2025年11月24日body { font-family: "Microsoft YaHei", "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; line-height: 1.6; color: rgba(51, 51, 51, 1); max-widt…

Dify、FastGPT、BuildingAI 与 RAGFlow 深度体验记录 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

增强AI股票预测分析报告 - 2025年11月24日

增强AI股票预测分析报告 - 2025年11月24日body { font-family: "Microsoft YaHei", "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; line-height: 1.6; color: rgba(51, 51, 51, 1); max-widt…