我正在开发一个加密程序,它使用“PIN”来计算加密的一些内容。我有一个文本框,用户可以在其中插入“PIN”。我想阻止人们输入任何数字。我在KeyPress事件上添加了这个:
If Not Char.IsControl(e.KeyChar) Then
If Not Char.IsNumber(e.KeyChar) Then
MsgBox("Invalid character", , "WARNING!")
TextBox3.Clear()
End If
End If
它显示了msgbox,直到我关闭了emsgbox才会写入文本框。键入的字符出现在文本框中。当我写另一个时它和以前一样工作,但它只替换最后一个字符而不是写另一个字符。有什么我想念的东西,因为这看起来像是我的错误吗?
答案 0 :(得分:2)
为TextBox设置ES_NUMBER窗口样式:
Public Class Form1
Public Const GWL_STYLE As Integer = (-16)
Public Const ES_NUMBER As Integer = &H2000
Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
(ByVal handle As IntPtr, ByVal nIndex As Integer) As Integer
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
(ByVal handle As IntPtr, ByVal nIndex As Integer, ByVal dwNewLong As Integer) As Integer
Public Sub SetNumbersOnlyTextBox(ByVal TB As TextBox)
SetWindowLong(TB.Handle, GWL_STYLE, GetWindowLong(TB.Handle, GWL_STYLE) Or ES_NUMBER)
End Sub
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
SetNumbersOnlyTextBox(TextBox3)
End Sub
End Class
答案 1 :(得分:0)
它显示了msgbox,在关闭emsgbox之前它不会写入文本框。
是的,这就是模态对话框的作用。它们会阻止调用者更新,直到关闭。这才是重点;在清除模态子项之前,用户无法与父项交互。
为什么不先简单地清除文本框?更好的是;根本不显示恼人的对话框。只需将e.Handled
设置为true,即可禁止用户输入无效字符。但是,它比听起来有点棘手,因为您需要允许退格键和删除键,禁用粘贴等。
以下是NumericTextbox
:http://msdn.microsoft.com/en-us/library/ms229644(v=vs.80).aspx
答案 2 :(得分:0)
您只需将Handled属性设置为true而不是clear:
e.Handled = True
答案 3 :(得分:0)
正如MarkPM上面所说,如果它是你不想要的一个键,你可以设置e.handle = true(当你截取按键事件的键时)让系统吃掉它。
除此之外,您可以在表单上标注“只能输入数字”或类似内容,而不是弹出窗口。将其设置为使文本的颜色为红色。同时进行设置,使标签通常不可见。
最后,同样在按键事件中,除了为不需要的键设置e.handle = true之外,当出现不需要的键时,使标签显示“只能在此处输入数字”可见 - 您还可以设置定时几秒钟后关闭标签可见性的事件。如果您愿意,也可以将Beep()投入混音: - )
这比弹出窗口更具侵入性,并且可以很好地为用户移动。