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

C#非数据绑定DataGridView单元格点击取值问题求助

在C#中实现无数据绑定DataGridView的单元格点击取值功能

问题背景

  • 现有未使用数据绑定的DataGridView(DGV),数据从SQLite数据库读取并填充,已完成DGV样式设置
  • 需求:点击DGV单元格时获取ID值,传递到其他窗体用于SQL查询,且不想使用数据绑定
  • 异常情况:尝试三种点击事件方法均无效果,但相同逻辑在VB.NET中可正常运行,怀疑是C#代码转换问题

问题原因分析

  1. CellContentClick事件局限性:该事件仅在点击单元格内的文本内容时触发,点击单元格空白区域不会响应,这是导致无效果的核心原因
  2. 代码逻辑冗余错误:原事件方法中存在矛盾判断(如strFName != " "后又判断strFName == " "),且末尾强制设置tbMessage.Text = "No Data Here"会覆盖正确提示
  3. 事件未正确绑定:手动编写的事件方法若未在设计器或代码中与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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 00:35:28