VB.NET+SQL Server:更新记录后DataGridView双击选数据异常问题
解决VB.NET DataGridView双击选中失效问题(存储过程更新后)
看起来你遇到的问题是用存储过程更新记录后,主列表DataGridView的双击事件无法正常选中并传递数据,结合你提供的代码和流程,我来帮你分析原因并给出修复方案:
核心问题分析
从你的代码和问题流程来看,大概率是以下几个原因导致的:
- 双击事件未做空值判断:直接访问
CurrentRow.Cells(0).Value,如果DataGridView刷新后没有选中行、或者行状态异常(比如新增行),就会触发空引用错误,导致事件失效。 - 主列表未彻底刷新:存储过程更新数据后,你的
LoadMode()方法可能没有重新查询视图数据并重新绑定到DataGridView,导致显示的还是旧数据,双击时取到的主键对应的数据状态异常。 - 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
相关产品推荐
相关产品推荐

