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

Visual Basic:窗体加载时MessageBox异常弹出问题的解决问询

解决窗体加载时误弹错误提示的问题

问题根源

当前代码里的txtNip_Enter事件会在窗体加载时txtNip获得焦点就触发,此时txtNip.Text是空字符串,调用KeypressID()去数据库查询自然找不到匹配数据,所以直接弹出错误提示,这完全不符合你的需求——只有用户输入内容后查询不到才该提示。

修复步骤

1. 给txtNip_Enter事件添加非空判断

修改txtNip_Enter方法,先检查输入框内容是否为空,空的话直接跳过查询逻辑,避免无意义的数据库请求和错误提示:

Private Sub txtNip_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtNip.Enter
    ' 先判断输入框是否为空,空则不执行后续逻辑
    If String.IsNullOrWhiteSpace(Me.txtNip.Text) Then
        Return
    End If

    cp.P_NIP = Me.txtNip.Text
    If cp.KeypressID() = True Then
        Me.txtNip.Enabled = False
        Me.Fill_Data()
    Else
        MessageBox.Show("Data Tidak Ditemukan, Nomor Induk Pegawai Yang Anda Masukan Salah..!!")
        Me.Bersih()
    End If
End Sub

2. 修复KeypressID()方法的数据库连接泄漏问题

当前KeypressID()里的cnn.Close()永远不会执行——因为不管dreader.Read()返回true还是false,都会先执行Return语句,导致连接一直处于打开状态。用Using语句自动管理连接和命令的生命周期,更安全可靠:

Public Function KeypressID() As Boolean
    ' Using语句会自动释放资源,无需手动Close
    Using cnn As New SqlConnection(StrConn)
        Using cmmd As New SqlCommand("SP_SELECT_PEGAWAI", cnn)
            cmmd.CommandType = CommandType.StoredProcedure
            cmmd.Parameters.Clear()
            cmmd.Parameters.Add(New SqlParameter("@P1", NIP))
            
            cnn.Open()
            Using dreader As SqlDataReader = cmmd.ExecuteReader()
                If dreader.Read = True 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 Using
End Function

3. 优化txtNip_KeyPress事件(可选)

原代码里的ElseIf Asc(e.KeyChar) = 13后面没有逻辑,可以简化判断,同时用Char.IsDigit替代Asc码判断,可读性更好:

Private Sub txtNip_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtNip.KeyPress
    ' 允许数字、退格键(8)、回车键(13)
    If Not (Char.IsDigit(e.KeyChar) Or e.KeyChar = Chr(8) Or e.KeyChar = Chr(13)) Then
        e.KeyChar = Chr(0)
        MessageBox.Show("Silahkan Masukan Data NIP Dengan Angka...!!")
    End If
    ' 回车键触发查询逻辑
    If e.KeyChar = Chr(13) Then
        txtNip_Enter(sender, EventArgs.Empty)
    End If
End Sub

效果说明

  • 现在窗体加载时,txtNip为空,Enter事件会直接跳过查询,不会弹出错误提示。
  • 只有当用户输入NIP内容,并且该内容在数据库中找不到时,才会弹出提示框,点击确定后调用Bersih()清空内容。
  • 数据库连接现在会被正确释放,避免连接池耗尽的问题。

内容的提问来源于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:53:14