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

