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

DataGridView输入NIP后无法自动带出姓名,求排查代码错误

问题诊断与修复方案

我帮你排查了代码里的几个关键问题,正是这些问题导致姓名无法自动显示:

1. 事件触发时机错误

你用了CellEnter事件,这个事件是当单元格刚获得焦点时触发的——这时候用户还没开始输入NIP呢!row.Cells(0).Value大概率是空值或者旧值,调用KeypressID()自然查不到对应的数据。

应该换成CellValueChanged事件(当单元格内容修改完成后触发),或者CellLeave事件(当单元格失去焦点时触发),这样才能获取到用户刚输入的有效NIP值。

2. NIP参数传递不匹配

在DgvUMutasi_CellEnter里,你把row.Cells(0).Value赋值给了cp.P_NIP,但KeypressID()函数里给存储过程传参用的是NIP变量——这两个变量没有关联,导致存储过程拿到的是未赋值的空值,查不到数据。

你可以修改KeypressID()让它接收NIP参数,确保传递的是用户输入的值:

' 修改KeypressID为带参数的函数
Public Function KeypressID(ByVal inputNIP As String) As Boolean
    ' Using语句自动管理连接,避免泄漏
    Using cnn As New SqlConnection(StrConn)
        Dim cmmd As New SqlCommand("SP_SELECT_PEGAWAI", cnn)
        cmmd.CommandType = CommandType.StoredProcedure
        cmmd.Parameters.Clear()
        ' 绑定用户输入的NIP到存储过程参数
        cmmd.Parameters.Add(New SqlParameter("@P1", inputNIP))
        
        cnn.Open()
        Using dreader As SqlDataReader = cmmd.ExecuteReader()
            If dreader.Read() Then
                ' 读取数据逻辑
                Dim ImgByte() As Byte = dreader("Foto")
                Dim ImgStr As New System.IO.MemoryStream(ImgByte)
                Me.Foto = Image.FromStream(ImgStr)
                Me.Nama = dreader("Nama")
                Me.Jabatan = dreader("Jabatan")
                Me.Daerah = dreader("Daerah")
                Me.Tsk = dreader("Tsk_Jab")
                Me.PktPns = dreader("Pnk_Pns")
                Me.GolPns = dreader("Gol_Pns")
                Me.TmtPns = dreader("Tmt_Pns")
                Me.Pensiun = dreader("Pensiun")
                Return True
            Else
                ' 清空数据逻辑
                Me.Foto = Nothing
                Me.Nama = ""
                Me.Jabatan = ""
                Me.Daerah = ""
                Me.Tsk = Date.Now
                Me.PktPns = ""
                Me.GolPns = ""
                Me.TmtPns = Date.Now
                Me.Pensiun = Date.Now
                Return False
            End If
        End Using
    End Using
End Function

3. 数据库连接未正确关闭

原来的KeypressID()里,cnn.Close()写在了Return语句之后——这行代码永远不会被执行,会导致数据库连接泄漏,甚至影响后续查询。上面的修复用了Using语句,能自动关闭连接并释放资源,是更安全的写法。

4. 单元格值空引用风险

获取单元格值时没有判断是否为DBNull或空,直接调用.ToString()会抛出异常。修复后的事件代码会先做有效性校验:

' 替换原CellEnter事件为CellValueChanged
Private Sub DgvUMutasi_CellValueChanged(ByVal sender As Object, ByVal e As DataGridViewCellEventArgs) Handles DgvUMutasi.CellValueChanged
    Dim columnName As String = DgvUMutasi.Columns(e.ColumnIndex).Name
    ' 只处理NIP列
    If columnName <> "NIP" Then Return
    
    Dim row As DataGridViewRow = DgvUMutasi.Rows(e.RowIndex)
    ' 检查NIP值是否有效
    Dim nipValue As Object = row.Cells("NIP").Value
    If nipValue Is Nothing OrElse DBNull.Value.Equals(nipValue) Then
        row.Cells(1).Value = ""
        Return
    End If
    Dim inputNIP As String = nipValue.ToString()
    
    ' 查询并更新姓名
    If cp.KeypressID(inputNIP) Then
        ' 注意:这里用cp.Nama,和KeypressID里赋值的Me.Nama对应
        row.Cells(1).Value = cp.Nama
    Else
        row.Cells(1).Value = "未找到该NIP"
    End If
End Sub

另外注意:你在KeypressID()里赋值的是Me.Nama,但原事件里用的是cp.P_Nama——如果类的属性是Nama,要确保事件里调用的是同一个属性,否则也会取不到值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:52:17