Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 在文本框中允许数字、点、退格和删除_Vb.net_Textbox - Fatal编程技术网

Vb.net 在文本框中允许数字、点、退格和删除

Vb.net 在文本框中允许数字、点、退格和删除,vb.net,textbox,Vb.net,Textbox,我有以下代码: Private Sub TxtPStof_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TxtPStof.KeyPress e.Handled = Not (Char.IsDigit(e.KeyChar) Or e.KeyChar = ".") End Sub 它只允许数字和。但是,在我的文本框中,我还需要能够使用ba

我有以下代码:

Private Sub TxtPStof_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TxtPStof.KeyPress
    e.Handled = Not (Char.IsDigit(e.KeyChar) Or e.KeyChar = ".")

End Sub
它只允许数字和。但是,在我的文本框中,我还需要能够使用backspace或delete按钮删除值

这可能吗


谢谢!:)

这是错误的方法

人们普遍认为,限制用户的输入对用户体验是有害的,并且您总是无法处理特殊情况(例如,Ctrl+V呢?啊,您忘记了这一点。每个人都是这样)

相反,.NET提供了验证用户输入的方法。您应该拦截该事件,而不是按键。允许用户输入他们想要的文本;特别是,允许他们不间断地犯错误(例如输入错误)——这将是极具破坏性的,也没有任何帮助


然后,一旦它们完成(因为输入焦点离开了控件),立即进行输入验证。

而我完全同意Konrad Rudolph的答案
(在按键事件中处理用户输入确实是件麻烦事)
我想回答你的问题

文档中的MSDN声明非字符键不会引发按键事件。这意味着您不会获得Delete键,而只获得BackSpace键。您只需对事件处理程序做一点小小的更改就可以处理这种情况

Private Sub TxtPStof_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TxtPStof.KeyPress 

    if e.KeyChar <> ControlChars.Back then
        e.Handled = Not (Char.IsDigit(e.KeyChar) Or e.KeyChar = ".") 
    end if

End Sub 
Private Sub txtpsofkeypress(ByVal sender作为System.Object,ByVal e作为System.Windows.Forms.KeyPressEventArgs)处理txtpsof.KeyPress
如果e.KeyChar控制chars.Back那么
e、 Handled=Not(Char.IsDigit(e.KeyChar)或e.KeyChar=“.”)
如果结束
端接头

这个代码对我来说很好用

 If Not ((Asc(e.KeyChar) >= 48 And Asc(e.KeyChar) <= 57) Or Asc(e.KeyChar) = 46 Or Asc(e.KeyChar) = 8 Or Asc(e.KeyChar) = 127) Then
        e.KeyChar = ""
        e.Handled = False
    End If
如果不是((Asc(e.KeyChar)>=48和Asc(e.KeyChar)试试这个:

    If Asc(e.KeyChar) < 48 Or Asc(e.KeyChar) > 57 Then
        If Not (Asc(e.KeyChar) = 8 Or Asc(e.KeyChar) = 46) Then e.Handled = True
    End If
如果Asc(e.KeyChar)<48或Asc(e.KeyChar)>57,则
如果不是(Asc(e.KeyChar)=8或Asc(e.KeyChar)=46),则e.Handled=True
如果结束
专用子文本框\u KeyPress(发送者作为对象,e作为KeyPressEventArgs)处理textbox.KeyPress
如果(e.KeyChar<“0”或e.KeyChar>“9”)和e.KeyChar ControlChars.Back
e、 已处理=真
如果结束
端接头

这应该是您希望它执行的操作。

将其置于按键事件上。这只允许点和数字

If Asc(e.KeyChar) <> 8 Then
            If Asc(e.KeyChar) < 46 Or Asc(e.KeyChar) > 57 Or (Asc(e.KeyChar) < 48 And Asc(e.KeyChar) > 46) Then
                e.Handled = True
      End If
End If
如果Asc(e.KeyChar)8那么
如果Asc(e.KeyChar)<46或Asc(e.KeyChar)>57或(Asc(e.KeyChar)<48且Asc(e.KeyChar)>46,则
e、 已处理=真
如果结束
如果结束
Private Sub TextBox1\u KeyPress(ByVal sender作为对象,ByVal e作为System.Windows.Forms.KeyPressEventArgs)处理TextBox1.KeyPress
Dim NumString=“0123456789.-”
如果不是NumString.Contains(例如KeyChar),则
如果Asc(e.KeyChar)8,则允许“退格”
e、 KeyChar=“”
如果结束
其他的
如果e.KeyChar=“-”则
如果Len(Trim(TxtDcrAmt.Text))>0,则
e、 KeyChar=“”
如果结束
如果结束
如果e.KeyChar=“”,则
如果TxtDcrAmt.Text.包含(“.”),则
e、 KeyChar=“”
如果结束
如果结束
如果TxtDcrAmt.Text.包含(“.”),则
Dim TLen为整数=0
TLen=TxtDcrAmt.Text.IndexOf(“.”+2
如果Len(Trim(TxtDcrAmt.Text))>TLen,则
e、 KeyChar=“”
如果结束
如果结束
如果结束
端接头

谢谢你,史蒂夫,我知道这有点混乱,但这是为我做这件事的最快方式,而且这个程序不会被多个ppl使用,实际上只有一个人,所以这对我来说不是问题,即使很困难,它也很混乱。我会在以后有更多时间的时候研究验证事件。感谢所有的帮助这是代码气味:
如果x那么variable=False Else variable=True
应重写为
variable=Not x
。请您添加一些解释,说明为什么要使用此代码?通常,如果答案中包含对代码用途的解释,以及在不介绍其他代码的情况下解决问题的原因,则会更有帮助。
Private Sub textbox_KeyPress(sender As Object, e As KeyPressEventArgs) Handles textbox.KeyPress
    If (e.KeyChar < "0" OrElse e.KeyChar > "9") AndAlso e.KeyChar <> ControlChars.Back Then
        e.Handled = True

    End If
End Sub
If Asc(e.KeyChar) <> 8 Then
            If Asc(e.KeyChar) < 46 Or Asc(e.KeyChar) > 57 Or (Asc(e.KeyChar) < 48 And Asc(e.KeyChar) > 46) Then
                e.Handled = True
      End If
End If
Private Sub TextBox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress
        Dim NumString = "0123456789.-"
        If Not NumString.Contains(e.KeyChar) Then
            If Asc(e.KeyChar) <> 8 Then  'BackSpace is allowed
                e.KeyChar = ""
            End If
        Else
            If e.KeyChar = "-" Then
                If Len(Trim(TxtDcrAmt.Text)) > 0 Then
                    e.KeyChar = ""
                End If
            End If

            If e.KeyChar = "." Then
                If TxtDcrAmt.Text.Contains(".") Then
                    e.KeyChar = ""
                End If
            End If

            If TxtDcrAmt.Text.Contains(".") Then
                Dim TLen As Integer = 0
                TLen = TxtDcrAmt.Text.IndexOf(".") + 2
                If Len(Trim(TxtDcrAmt.Text)) > TLen Then
                    e.KeyChar = ""
                End If
            End If
        End If
    End Sub