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事件处理按钮点击逻辑(该事件仅在点击单元格内容时触发,可避免点空白区域误触),全程通过列名匹配判断,不硬编码索引,避免后续列顺序调整导致代码失效。
- 绑定事件(如果没在设计器里绑定,在加完按钮列的代码后面追加这行即可)
dataGridView1.CellContentClick += dataGridView1_CellContentClick;
- 编写事件处理逻辑
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}"); }
界面参考

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

