VB.net需要一个文本框只接受数字

36

我是VB.net的新手(自学),想知道是否有人可以帮我编写一些代码。我只是想要一个TextBox,它可以接受1到10的数字值。我不想让它接受字符串或超过10的任何数字。如果有人输入了单词或字符,将出现错误消息,告诉他输入有效的数字。以下是我的代码;显然并不好用,因为我遇到了问题。再次感谢任何能够帮忙的人。

 If TxtBox.Text > 10 Then
        MessageBox.Show("Please Enter a Number from 1 to 10")
        TxtBox.Focus()
    ElseIf TxtBox.Text < 10 Then
        MessageBox.Show("Thank You, your rating was " & TxtBox.Text)
        Total = Total + 1
    ElseIf IsNumeric(TxtBox.Text) Then
        MessageBox.Show("Thank you, your rating was " & ValueTxtBox.Text)
    End If

    ValueTxtBox.Clear()
    ValueTxtBox.Focus()
29个回答

42
你可以使用 ASCII 整数来实现这个功能。将此代码放置在文本框的 Keypress 事件中。e.KeyChar 表示按下的键,内置函数 Asc() 将其转换为其 ASCII 整数。
Private Sub TextBox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress

    '97 - 122 = Ascii codes for simple letters
    '65 - 90  = Ascii codes for capital letters
    '48 - 57  = Ascii codes for numbers

    If Asc(e.KeyChar) <> 8 Then
        If Asc(e.KeyChar) < 48 Or Asc(e.KeyChar) > 57 Then
            e.Handled = True
        End If
    End If

End Sub

6
我发现这段代码非常有用,但想提醒大家这段代码无法防止用户复制粘贴任何非期望字符,因为键盘按下事件并不会在粘贴时发生,而且用户可以在粘贴时同时复制粘贴多个字符。我建议再增加一行代码检查输入的结果字符串是否符合期望的格式要求。 - David Schmidt
2
我给你点赞,因为你考虑到了复制/粘贴,但我发现这实际上有相反的问题。你不能复制/粘贴字母,但你也不能复制/粘贴数字。 - BCarpe
@DavidSchmidt 谢谢,我在尝试上面的代码后才看到了你的评论,你说得太对了。 - evry1falls

25

以下是我为了处理键盘输入和复制/粘贴所做的工作。

Private Sub TextBox_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox.KeyPress
    If Not Char.IsNumber(e.KeyChar) AndAlso Not Char.IsControl(e.KeyChar) Then
        e.Handled = True
    End If
End Sub

Private Sub TextBox_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox.TextChanged
    Dim digitsOnly As Regex = New Regex("[^\d]")
    TextBox.Text = digitsOnly.Replace(TextBox.Text, "")
End Sub

如果您想允许小数和负数金额,请添加

AndAlso Not e.KeyChar = "." AndAlso Not e.keyChar = "-"

在KeyPress部分添加if语句。


11

VB.NET中最简单的文本框验证解决方案

Visual Basic(VB.NET)的文本框验证

首先,在项目中添加一个新的VB代码文件。

  1. 进入解决方案资源管理器
  2. 右键单击您的项目
  3. 选择添加 > 新建项...
  4. 添加新的VB代码文件(例如example.vb)

或者按下Ctrl+Shift+A

将以下代码复制并粘贴到此文件中,并为其提供一个适当的名称。(例如KeyValidation.vb)

Imports System.Text.RegularExpressions
Module Module1
    Public Enum ValidationType
        Only_Numbers = 1
        Only_Characters = 2
        Not_Null = 3
        Only_Email = 4
        Phone_Number = 5
    End Enum
    Public Sub AssignValidation(ByRef CTRL As Windows.Forms.TextBox, ByVal Validation_Type As ValidationType)
        Dim txt As Windows.Forms.TextBox = CTRL
        Select Case Validation_Type
            Case ValidationType.Only_Numbers
                AddHandler txt.KeyPress, AddressOf number_Leave
            Case ValidationType.Only_Characters
                AddHandler txt.KeyPress, AddressOf OCHAR_Leave
            Case ValidationType.Not_Null
                AddHandler txt.Leave, AddressOf NotNull_Leave
            Case ValidationType.Only_Email
                AddHandler txt.Leave, AddressOf Email_Leave
            Case ValidationType.Phone_Number
                AddHandler txt.KeyPress, AddressOf Phonenumber_Leave
        End Select
    End Sub
    Public Sub number_Leave(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs)
        Dim numbers As Windows.Forms.TextBox = sender
        If InStr("1234567890.", e.KeyChar) = 0 And Asc(e.KeyChar) <> 8 Or (e.KeyChar = "." And InStr(numbers.Text, ".") > 0) Then
            e.KeyChar = Chr(0)
            e.Handled = True
        End If
    End Sub
    Public Sub Phonenumber_Leave(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs)
        Dim numbers As Windows.Forms.TextBox = sender
        If InStr("1234567890.()-+ ", e.KeyChar) = 0 And Asc(e.KeyChar) <> 8 Or (e.KeyChar = "." And InStr(numbers.Text, ".") > 0) Then
            e.KeyChar = Chr(0)
            e.Handled = True
        End If
    End Sub
    Public Sub OCHAR_Leave(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs)
        If InStr("1234567890!@#$%^&*()_+=-", e.KeyChar) > 0 Then
            e.KeyChar = Chr(0)
            e.Handled = True
        End If
    End Sub
    Public Sub NotNull_Leave(ByVal sender As Object, ByVal e As System.EventArgs)
        Dim No As Windows.Forms.TextBox = sender
        If No.Text.Trim = "" Then
            MsgBox("This field Must be filled!")
            No.Focus()
        End If
    End Sub
    Public Sub Email_Leave(ByVal sender As Object, ByVal e As System.EventArgs)
        Dim Email As Windows.Forms.TextBox = sender
        If Email.Text <> "" Then
            Dim rex As Match = Regex.Match(Trim(Email.Text), "^([0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,3})$", RegexOptions.IgnoreCase)
            If rex.Success = False Then
                MessageBox.Show("Please Enter a valid Email Address", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information)
                Email.BackColor = Color.Red
                Email.Focus()
                Exit Sub
            Else
                Email.BackColor = Color.White
            End If
        End If
    End Sub
End Module

现在使用以下代码来设置表单加载事件,如下所示。

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        AssignValidation(Me.TextBox1, ValidationType.Only_Digits)
        AssignValidation(Me.TextBox2, ValidationType.Only_Characters)
        AssignValidation(Me.TextBox3, ValidationType.No_Blank)
        AssignValidation(Me.TextBox4, ValidationType.Only_Email)
End Sub

完成了..!


1
我已经在不同的项目中使用了这种方法几次,它总是完美地满足我的需求。谢谢分享! - Automate This
我添加了一个MODULE,并使用only_numbers,没有使用only_digist。非常棒的工作!! - R.Alonso
在我的Microsoft Visual Studio Community 2022 (64 bits) - Versión 17.4.4上完美运行。唯一需要注意的是,在表单加载私有子程序中,您需要将“Only_Digits”更改为“Only_Numbers”。 - Николаи Милош
Microsoft Visual Studio Community 2022 (64位) - 版本17.4.4上对我来说完美无缺地运行。 唯一的细节是您需要在Form Load Private Sub中将Only_Digits更改为Only_Numbers - Николаи Милош

9

在处理之前,您首先需要验证输入是否为整数。您可以使用Integer.TryParse来进行验证:

Dim intValue As Integer
If Integer.TryParse(TxtBox.Text, intValue) AndAlso intValue > 0 AndAlso intValue < 11 Then
    MessageBox.Show("Thank You, your rating was " & TxtBox.Text)
Else
    MessageBox.Show("Please Enter a Number from 1 to 10")
End If

这似乎是最接近问题的答案,而不需要进行复杂的键处理。 - Olivier Jacot-Descombes

6

试试这个:

Private Sub txtCaseID_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtCaseID.KeyPress
    If Not Char.IsNumber(e.KeyChar) AndAlso Not Char.IsControl(e.KeyChar) Then e.KeyChar = ""
End Sub

3
Private Sub MyTextBox_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles MyTextBox.KeyPress
    If Not IsNumeric(e.KeyChar) And Not e.KeyChar = ChrW(Keys.Back) Then
        e.Handled = True
    End If
End Sub

3

您可以使用一个NumericUpDown控件而不是文本框来避免任何代码,这样会自动只允许数字并具有最大和最小值。 它还允许直接访问数字,如NumericUpDown1.Value,以及使用上下箭头设置数字。 如果输入的数字高于/超过最大值,则会跳转到最近的允许数字。


1
虽然NumericUpDown通常最适合输入较小的数字,但True。如果我需要在千或百万级别(如美元金额)输入数字,则在输入字段中使用那些上/下箭头会让我觉得奇怪。其次,NumericUpDown存在与字体大小相关的烦人UI问题。 - OfficeAddinDev

3
Private Sub textBox5_KeyPress(sender As System.Object, e As System.Windows.Forms.KeyPressEventArgs) Handles textBox5.KeyPress
        If Asc(e.KeyChar) <> 8 Then
            If Asc(e.KeyChar) < 48 Or Asc(e.KeyChar) > 57 Then
                e.Handled = True
            End If
        End If
    End Sub

2
Private Sub Data_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Data.KeyPress
    If (Not e.KeyChar = ChrW(Keys.Back) And ("0123456789.").IndexOf(e.KeyChar) = -1) Or (e.KeyChar = "." And Data.Text.ToCharArray().Count(Function(c) c = ".") > 0) Then
        e.Handled = True
    End If
End Sub

1
Dim ch(10) As Char
Dim len As Integer
len = TextBox1.Text.Length
ch = TextBox1.Text.ToCharArray()
For i = 0 To len - 1
    If Not IsNumeric(ch(i)) Then
        MsgBox("Value you insert is not numeric")
    End If
Next

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接