VB 2012 TextBox.Clear()不起作用

时间:2013-05-04 20:56:10

标签: vb.net textbox

我正在开发一个加密程序,它使用“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 个答案:

答案 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

TextBox with ES_NUMBER window style

答案 1 :(得分:0)

  

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

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

为什么不先简单地清除文本框?更好的是;根本不显示恼人的对话框。只需将e.Handled设置为true,即可禁止用户输入无效字符。但是,它比听起来有点棘手,因为您需要允许退格键和删除键,禁用粘贴等。

以下是NumericTextboxhttp://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()投入混音: - )

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