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

VB.NET DataGridView按回车/Tab查询数据重复添加、新记录不显示问题

问题原因
  • 按键判断逻辑错误:Keys.Enter = 13属于常量判断,返回值永远为真,任何按键都会触发查询逻辑;同时未禁用回车键的默认换行行为,按下回车后当前行自动跳转,导致获取的行数据错位。
  • 未读取编辑状态的实时值:DataGridView单元格处于编辑状态时,输入内容暂存在编辑控件中,不会主动同步到单元格的Value属性,直接读取Cells(0).Value只能拿到上一次提交的旧编码,导致每次查询都返回首次的结果,重复添加记录。
  • 缺少触发场景限定:没有判断当前是否处于产品编码列(第一列)的编辑状态,其他列操作也会误触发查询。
解决方案

1. 修正回车键事件逻辑

替换原有dgvdetalle_KeyPress代码,增加编辑提交、默认行为屏蔽逻辑:

Private Sub dgvdetalle_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles dgvdetalle.KeyPress
    ' 仅当按下回车键、且当前处于第一列(产品编码列)时触发
    If Asc(e.KeyChar) = 13 AndAlso dgvdetalle.CurrentCell.ColumnIndex = 0 Then
        ' 屏蔽回车键默认的换行跳转行为
        e.Handled = True
        ' 主动提交当前编辑内容,同步到单元格Value属性
        dgvdetalle.EndEdit()
        ' 执行查询
        mostrarproductosbonus()
        ' 清空当前输入的编码,跳转到新行的编码列准备下一次输入
        dgvdetalle.CurrentRow.Cells(0).Value = ""
        dgvdetalle.CurrentCell = dgvdetalle.Rows(dgvdetalle.NewRowIndex).Cells(0)
    End If
End Sub

2. 优化产品查询方法

增加非空校验,避免全局DataTable残留旧数据:

Sub mostrarproductosbonus()
    ' 读取当前输入的产品编码,做空判断
    Dim productCode As String = Me.dgvdetalle.CurrentRow.Cells(0).Value?.ToString().Trim()
    If String.IsNullOrEmpty(productCode) Then Return
    
    ' 每次查询初始化新的DataTable,避免旧数据残留
    Dim dt As New DataTable()
    dt = negLog.buscar_pro_parametro(VGlobales.Base, productCode)

    For Each data As DataRow In dt.Rows
        Dim aa As Integer = Me.dgvdetalle.Rows.Add()
        Me.dgvdetalle.Rows(aa).Cells(0).Value = data("IDPRODUCTO").ToString()
        Me.dgvdetalle.Rows(aa).Cells(1).Value = data("DESCRIPCION").ToString()
    Next
End Sub

3. 可选:支持Tab键触发查询

Tab键不会触发KeyPress事件,如需支持Tab键触发查询,可新增以下重写方法:

Protected Overrides Function ProcessDialogKey(ByVal keyData As Keys) As Boolean
    ' 仅当按下Tab键、且处于第一列编辑状态时触发
    If keyData = Keys.Tab AndAlso dgvdetalle.CurrentCell.ColumnIndex = 0 AndAlso dgvdetalle.IsCurrentCellInEditMode Then
        dgvdetalle.EndEdit()
        mostrarproductosbonus()
        dgvdetalle.CurrentRow.Cells(0).Value = ""
        dgvdetalle.CurrentCell = dgvdetalle.Rows(dgvdetalle.NewRowIndex).Cells(0)
        ' 屏蔽Tab键默认的单元格跳转行为
        Return True
    End If
    Return MyBase.ProcessDialogKey(keyData)
End Function

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 06:57:04