You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#点击DataGridView动态按钮列获取选中行指定列值的问题

问题说明

通过SQL查询填充C# DataGridView控件后,动态追加了名为「Verstuur reminder」的按钮列,需要实现点击按钮时获取当前行Gebruikersnaam列的单元格值,之前通过硬编码列索引判断的方式无法正确取值。

动态添加按钮列的原有代码:

DataGridViewButtonColumn btn = new DataGridViewButtonColumn();
btn.HeaderText = "reminder";
btn.Text = "Verstuur reminder";
btn.Name = "reminder";
btn.UseColumnTextForButtonValue = true;
dataGridView1.Columns.Add(btn);

原有失效的测试代码:

if (e.ColumnIndex == 0) 
{
    MessageBox.Show((e.RowIndex+1)+"Rij "+(e.ColumnIndex+1)+"Column ");
}
失效原因

动态添加的按钮列是在所有数据列加载完成后追加的,列索引不是0,硬编码e.ColumnIndex == 0的判断完全无法匹配到按钮列的点击动作,自然取不到目标值。

实现方案

使用CellContentClick事件处理按钮点击逻辑(该事件仅在点击单元格内容时触发,可避免点空白区域误触),全程通过列名匹配判断,不硬编码索引,避免后续列顺序调整导致代码失效。

  1. 绑定事件(如果没在设计器里绑定,在加完按钮列的代码后面追加这行即可)
dataGridView1.CellContentClick += dataGridView1_CellContentClick;
  1. 编写事件处理逻辑
private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
    // 过滤点击列头、行头的无效操作,避免索引越界报错
    if (e.RowIndex < 0 || e.ColumnIndex < 0) return;

    // 校验当前点击的是否为目标按钮列
    if (dataGridView1.Columns[e.ColumnIndex].Name != "reminder") return;

    // 取当前行Gebruikersnaam列的值,做非空处理
    string gebruikersnaam = dataGridView1.Rows[e.RowIndex].Cells["Gebruikersnaam"].Value?.ToString() ?? string.Empty;
    
    // 此处编写后续业务逻辑,以下为测试代码
    MessageBox.Show($"当前选中行的用户名:{gebruikersnaam}");
}
界面参考

DataGrid界面截图

注意事项
  • 不要硬编码列索引:判断按钮列、取目标值时都优先用列名匹配,后续调整列顺序、增减列时代码不需要修改
  • 必须加索引合法性判断:点击列头、行头时会触发同类点击事件,此时行/列索引为-1,直接取值会触发空引用异常
  • 如果单元格值可能为null,一定要加空值处理,避免调用ToString()时报错

内容的提问来源于stack exchange,提问作者alain seys

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 04:54:16