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
相关产品推荐
相关产品推荐

