当前位置: 首页 > news >正文

winfrom 操作列 动态按钮

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.jsqmd.com/news/49703/

相关文章:

  • 蓝桥杯-Python-基础语法
  • 电脑重启后WiFi服务没有启动导致WiFi无法开启
  • 大盘风险控制策略分析报告 - 2025年11月24日 - 20:51:47
  • Oracle 数据库体系结构详解
  • LRU缓存-leetcode
  • 总结-esp-idf 接口与抽象层设计
  • 洛谷-训练题-算法1-2
  • 高性能AI股票预测分析报告 - 2025年11月24日 - 20:46:52
  • 兄弟们我是好
  • 博客园真好用
  • 高性能AI股票预测分析报告 - 2025年11月24日 - 20:48:15
  • 肥东三中第19名 黄景行
  • 增强AI股票预测分析报告 - 2025年11月24日 - 20:43:55
  • 102302106-陈昭颖-第三次作业
  • 2025 年 11 月 GEO 公司推荐权威榜单:十大品牌价值内核与实战解决方案盘点
  • 2025 年 11 月 GEO 公司推荐权威榜单:十大品牌核心优势与定制化解决方案指南
  • NewStarCTF2024 Pwn Week2 Bad Asm
  • 增强AI股票预测分析报告 - 2025年11月24日 - 20:40:49
  • Dify、FastGPT、BuildingAI 与 RAGFlow 深度体验记录 - 实践
  • 增强AI股票预测分析报告 - 2025年11月24日
  • 2025年11月GEO优化公司推荐权威榜单:十大品牌核心价值与解决方案全方位解析
  • 2025年11月GEO公司推荐选择指南:专业分析维度助力企业的精准决策
  • 102302139 尚子骐 数据采集与融合作业3
  • 兄弟们好
  • Day47(17)-F:\硕士阶段\Java\课程代码\后端\web-ai-code\web-ai-project02
  • 国内可靠的清障车品牌排行,折臂高空作业车/拖吊联体清障车/云梯高空作业车/蓝牌清障车/二手蓝牌平板拖车/高空作业车清障车专业厂家选哪家
  • 2025年本地好评恒温恒湿箱品牌TOP10,砂尘试验箱/盐水喷雾试验箱及各种老化房/恒温恒湿试验箱/高低温交变量热试验箱恒温恒湿箱公司推荐
  • 2025年11月GEO优化公司推荐优选指南:专业分析维度助力企业精准决策
  • 开题报告模板详解:手把手教你写出完美开题报告
  • 题解:CF2157D Billion Players Game