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

VB.NET+SQL Server:更新记录后DataGridView双击选数据异常问题

解决VB.NET DataGridView双击选中失效问题(存储过程更新后)

看起来你遇到的问题是用存储过程更新记录后,主列表DataGridView的双击事件无法正常选中并传递数据,结合你提供的代码和流程,我来帮你分析原因并给出修复方案:

核心问题分析

从你的代码和问题流程来看,大概率是以下几个原因导致的:

  1. 双击事件未做空值判断:直接访问CurrentRow.Cells(0).Value,如果DataGridView刷新后没有选中行、或者行状态异常(比如新增行),就会触发空引用错误,导致事件失效。
  2. 主列表未彻底刷新:存储过程更新数据后,你的LoadMode()方法可能没有重新查询视图数据并重新绑定到DataGridView,导致显示的还是旧数据,双击时取到的主键对应的数据状态异常。
  3. SQL拼接存在风险:双击事件里直接拼接SQL语句,不仅容易触发SQL注入,还可能因为主键类型不匹配(比如BorrowerId是Int类型,你转成字符串拼接)导致查询失败。

具体修复步骤

1. 修复DoubleClick事件:添加空值判断+参数化查询

修改你的双击事件代码,先判断是否有有效选中行,同时改用参数化查询避免问题:

Private Sub dgvBorrowerMasterlist_DoubleClick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles dgvBorrowerMasterlist.DoubleClick
    ' 先校验是否有有效选中行
    If dgvBorrowerMasterlist.CurrentRow Is Nothing OrElse dgvBorrowerMasterlist.CurrentRow.IsNewRow Then
        MessageBox.Show("请选择一条有效的记录进行编辑", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning)
        Return
    End If

    Dim frmEdit As New frmApplication
    Dim dt As New DataTable

    ' 改用参数化查询,避免SQL注入+类型不匹配问题
    strQuery = "SELECT * FROM VLmsAppMasterlist WHERE BorrowerId = @BorrowerId"
    cmd = con.CreateCommand()
    cmd.CommandText = strQuery
    ' 注意BorrowerId是Int类型,直接传值不用转字符串
    cmd.Parameters.Add("@BorrowerId", SqlDbType.Int).Value = dgvBorrowerMasterlist.CurrentRow.Cells(0).Value

    Try
        da.SelectCommand = cmd
        da.Fill(dt)

        If dt.Rows.Count > 0 Then
            txtSearch.Text = String.Empty
            Me.Close()
            CloseAllChild()

            frmEdit.Show()
            frmEdit.EditMode()
            frmEdit.StartPosition = FormStartPosition.CenterScreen

            ' 赋值时建议加上ToString(),避免DBNull异常
            frmEdit.lblBorrowerId2.Text = dt.Rows(0).Item(0).ToString()
            frmEdit.txtLastName.Text = dt.Rows(0).Item(1).ToString()
            frmEdit.txtFirstName.Text = dt.Rows(0).Item(2).ToString()
            frmEdit.txtMiddleName.Text = dt.Rows(0).Item(3).ToString()
            frmEdit.txtNickname.Text = dt.Rows(0).Item(4).ToString()
            frmEdit.txtAddress.Text = dt.Rows(0).Item(5).ToString()
            frmEdit.cbOwnership.SelectedValue = dt.Rows(0).Item(6)
            frmEdit.txtContactNumber.Text = dt.Rows(0).Item(8).ToString()
            ' 其他字段同理补充...
        Else
            MessageBox.Show("未找到对应的记录,请刷新列表后重试", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information)
        End If
    Catch ex As Exception
        MessageBox.Show($"加载记录失败:{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error)
    Finally
        ' 记得释放资源
        cmd.Dispose()
        dt.Dispose()
    End Try
End Sub

2. 确保主列表DataGridView彻底刷新

检查你的LoadMode()方法,必须包含重新查询视图数据并绑定到DataGridView的逻辑,确保更新后显示的是最新数据:

Private Sub LoadMode()
    ' 重新查询主列表数据(根据你的业务需求添加过滤条件)
    Dim dtMaster As New DataTable
    strQuery = "SELECT * FROM VLmsAppMasterlist"
    cmd = con.CreateCommand()
    cmd.CommandText = strQuery
    
    Try
        da.SelectCommand = cmd
        da.Fill(dtMaster)
        
        ' 重新绑定数据源
        dgvBorrowerMasterlist.DataSource = dtMaster
        
        ' 配置DataGridView选择模式,确保能正确选中行
        dgvBorrowerMasterlist.SelectionMode = DataGridViewSelectionMode.FullRowSelect
        dgvBorrowerMasterlist.MultiSelect = False
        dgvBorrowerMasterlist.ReadOnly = True ' 如果是展示列表建议设为只读
    Catch ex As Exception
        MessageBox.Show($"刷新列表失败:{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error)
    Finally
        cmd.Dispose()
        dtMaster.Dispose()
    End Try
End Sub

3. 额外检查项

  • 视图数据同步:确认你的VLmsAppMasterlist视图是基于实时表数据的,存储过程更新后,视图能及时获取到最新数据(如果视图关联了多个表,要确保所有关联表的数据都被正确更新)。
  • DataGridView状态:检查DataGridView的Enabled属性是否为True,没有被其他控件抢占焦点。
  • 连接释放:存储过程执行后确保数据库连接被正确关闭(你的代码里已经做了con.Close(),这点没问题)。

总结

按照以上步骤修改后,应该能解决你遇到的双击选中失效问题。核心是要确保操作后数据及时刷新,并在事件中做好空值和异常处理,同时避免不安全的SQL拼接写法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:15:36