1

我正在开发一个加密程序,它使用“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 之前它不会写入文本框。键入的字符出现在文本框中。当我写另一个时,它的工作方式和以前一样,但它只替换最后一个字符而不是写另一个。有什么我想念的东西,因为这对我来说看起来像是一个错误吗?

4

4 回答 4

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

具有 ES_NUMBER 窗口样式的文本框

于 2013-05-04T21:17:47.833 回答
0

它显示了 msgbox,并且在我关闭 emsgbox 之前它不会写入文本框。

是的,这就是模态对话框的作用。他们阻止调用者更新,直到关闭。这才是重点; 在清除模态子项之前,用户无法与父项交互。

为什么不先清除文本框?更好;根本不显示烦人的对话框。e.Handled只需设置为 true即可禁止用户输入无效字符。但是,这比听起来要复杂一些,因为您需要允许退格键和删除键、禁用粘贴等。

这是一个示例:http NumericTextbox: //msdn.microsoft.com/en-us/library/ms229644 (v=vs.80).aspx

于 2013-05-04T21:02:14.917 回答
0

您只需要将 Handled 属性设置为 true 而不是 clear:

e.Handled = True
于 2013-05-04T21:02:32.340 回答
0

正如上面 MarkPM 所指出的,如果它是您不想要的键,您可以设置 e.handle=true (当您在按键事件中截获该键时)让系统吃掉它。

除此之外,您可以在表单上使用“只能在此处输入数字”或类似内容的标签,而不是弹出窗口。设置它,使文本的颜色为红色。还要设置它,使标签通常不可见。

最后,同样在按键事件中,除了为不需要的键设置 e.handle=true 之外,当出现不需要的键时,使“此处只能输入数字”的标签可见 - 您还可以设置一个定时事件来转动几秒钟后标签的可见性消失。如果您愿意,也可以将 Beep() 加入到组合中:-)

这比弹出窗口更具侵入性,并且可以很好地为用户移动。

于 2013-05-05T02:30:17.110 回答