C#非数据绑定DataGridView单元格点击取值问题求助
在C#中实现无数据绑定DataGridView的单元格点击取值功能
问题背景
- 现有未使用数据绑定的DataGridView(DGV),数据从SQLite数据库读取并填充,已完成DGV样式设置
- 需求:点击DGV单元格时获取ID值,传递到其他窗体用于SQL查询,且不想使用数据绑定
- 异常情况:尝试三种点击事件方法均无效果,但相同逻辑在VB.NET中可正常运行,怀疑是C#代码转换问题
问题原因分析
CellContentClick事件局限性:该事件仅在点击单元格内的文本内容时触发,点击单元格空白区域不会响应,这是导致无效果的核心原因- 代码逻辑冗余错误:原事件方法中存在矛盾判断(如
strFName != " "后又判断strFName == " "),且末尾强制设置tbMessage.Text = "No Data Here"会覆盖正确提示 - 事件未正确绑定:手动编写的事件方法若未在设计器或代码中与DGV控件关联,也会导致事件不触发
解决方案
推荐使用**CellClick或CellMouseClick**事件,这两个事件在点击单元格任意区域时都会触发,以下是修正后的完整实现:
1. 替换点击事件方法
替换原有的事件方法,使用CellClick实现取值逻辑:
private void dgvPerson_CellClick(object sender, DataGridViewCellEventArgs e) { // 排除点击表头或无效行的情况 if (e.RowIndex < 0 || e.ColumnIndex < 0) { tbMessage.Text = "请点击数据行"; return; } DataGridViewRow selectedRow = dgvPerson.Rows[e.RowIndex]; // 确保单元格值不为null再转换,避免空引用异常 if (selectedRow.Cells[0].Value != null) { gv_parentInt = selectedRow.Cells[0].Value.ToString().Trim(); tbID.Text = gv_parentInt; } if (selectedRow.Cells[1].Value != null) { gv_firstName = selectedRow.Cells[1].Value.ToString().Trim(); tbFName.Text = gv_firstName; } if (selectedRow.Cells[2].Value != null) { gv_lastName = selectedRow.Cells[2].Value.ToString().Trim(); tbLName.Text = gv_lastName; } tbMessage.Text = "已选中数据行"; }
2. 确保事件绑定
选择以下任意一种方式绑定事件:
- 设计器绑定:选中
dgvPerson控件,打开属性窗口的事件列表,找到CellClick,选择对应的dgvPerson_CellClick方法 - 代码手动绑定:在窗体构造函数中添加绑定代码:
public frmSelect() { InitializeComponent(); // 手动绑定CellClick事件 dgvPerson.CellClick += dgvPerson_CellClick; }
3. 修正原代码其他问题
- 移除
StyleDGV方法中的this.Controls.Add(dgvPerson);:若DGV已在设计器中添加,该行代码会重复添加控件导致异常 - 移除
readFriendsData方法中的conn.Close();:using语句会自动释放并关闭数据库连接 - 删除原无效的
CellContentClick和注释的事件方法,避免代码冗余
4. 传递ID到其他窗体示例
在需要打开目标窗体时,将获取到的ID作为参数传递:
// 示例:打开需要ID的查询窗体 private void OpenQueryForm() { if (!string.IsNullOrEmpty(gv_parentInt)) { frmQuery queryForm = new frmQuery(gv_parentInt); queryForm.Show(); } else { tbMessage.Text = "请先选中一行数据"; } }
对应的目标窗体构造函数:
public class frmQuery : Form { private string _selectedId; public frmQuery(string selectedId) { InitializeComponent(); _selectedId = selectedId; // 在此处使用_selectedId执行SQL查询逻辑 } }
内容的提问来源于stack exchange,提问作者Vector
相关产品推荐
相关产品推荐

