当前位置: 首页 > 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.gsyq.cn/news/59539.html

相关文章:

  • 蓝桥杯-Python-基础语法
  • 高性能AI股票预测分析报告 - 2025年11月24日 - 20:46:52
  • 博客园真好用
  • 增强AI股票预测分析报告 - 2025年11月24日 - 20:43:55
  • 102302106-陈昭颖-第三次作业
  • 2025 年 11 月 GEO 公司推荐权威榜单:十大品牌价值内核与实战解决方案盘点
  • 2025 年 11 月 GEO 公司推荐权威榜单:十大品牌核心优势与定制化解决方案指南
  • NewStarCTF2024 Pwn Week2 Bad Asm
  • 增强AI股票预测分析报告 - 2025年11月24日
  • 102302139 尚子骐 数据采集与融合作业3
  • 2025年11月GEO优化公司推荐优选指南:专业分析维度助力企业精准决策
  • 开题报告模板详解:手把手教你写出完美开题报告
  • 2025年11月GEO优化服务商推荐对比分析:三大阵营专业维度深度评测
  • 题解:CF2157D Billion Players Game
  • 2025-11-24
  • NewStarCTF2024 Week4 Pwn MakeHero
  • 「张张讲AI」AI资讯公众号:联动深圳人才集团,讲师输出资讯+授课,助力AI落地
  • 2025年11月GEO优化公司推荐评测报告:从稳定性到AI能力的解决方案剖析
  • WPF的四种曲线绘制
  • 别让你的SQL跑了一整晚,最后只产出一堆数字垃圾
  • Windwos11终端的作用
  • 2025空调噪声治理厂家精选
  • 2025.11.24模拟赛
  • 热流道厂家品牌有哪些?2025热流道技术哪家强?
  • 2025安全生产目视化管理公司有哪些:优质目视化管理机构推荐
  • 2025热流道厂家选哪家好?热流道厂家排名实力榜单
  • 2025外贸独立站哪家公司好?泉州独立站外贸建站公司推荐
  • 2025铸铁研磨盘哪家强:球墨铸铁研磨盘生产厂家测评
  • 2025移动水肥一体机定做:莱芜水肥一体机厂家有哪些盘点
  • 2025中山财税公司大盘点-中山代办注册公司哪家好