programing

VB.net 숫자만 허용하려면 텍스트 상자 필요

instargram 2023. 6. 1. 22:12
반응형

VB.net 숫자만 허용하려면 텍스트 상자 필요

저는 VB.net (독학)에 꽤 익숙하며, 코드를 만드는 데 도움을 줄 수 있는 사람이 있는지 궁금했습니다.너무 관련된 ▁a▁have▁i다아니닙▁just것이,▁too▁anything저하▁involved'▁to는. 그냥 한 번 해보세요.TextBox1 사이의 할 수 있습니다.문자열이나 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()

아스키 정수를 사용하여 이 작업을 수행할 수 있습니다.텍스트 상자의 키 누르기 이벤트에 이 코드를 입력합니다. 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

이것은 키 입력과 복사/붙여넣기를 모두 처리하기 위해 수행한 작업입니다.

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 = "-"

키 프레스 섹션의 if 문으로 이동합니다.

VB.NET의 TextBox 검증을 위한 가장 간단한 솔루션

VB.NET(Visual Basic)에 대한 텍스트 상자 유효성 검사

먼저 프로젝트에 새 VB 코드 파일을 추가합니다.

  1. 솔루션 탐색기로 이동
  2. 프로젝트를 마우스 오른쪽 단추로 클릭합니다.
  3. 추가 > 새 항목 선택...
  4. 새 VB 코드 파일(예: vb) 추가

또는 ++ShiftA를 누릅니다.

다음 코드를 이 파일에 복사하여 붙여넣고 적절한 이름을 지정합니다.(예: 키 검증.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

완료...!

먼저 입력이 실제로 정수인지 확인해야 합니다. 있다니습으로 하면 됩니다.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

사용해 보십시오.

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

텍스트 상자 대신 숫자 업다운 컨트롤을 사용하면 코드를 피할 수 있습니다. 이 컨트롤은 자동으로 숫자만 허용하고 최대값과 최소값을 갖습니다.또한 사용하여 직접 번호에 액세스할 수 있습니다.NumericUpDown1.Value위쪽 및 아래쪽 화살표를 사용하여 숫자를 설정할 수 있습니다.또한 최대값보다 큰 숫자를 입력하면 허용되는 가장 가까운 숫자로 점프합니다.

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
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
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
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
If Not Char.IsNumber(e.KeyChar) AndAlso Not e.KeyChar = "." AndAlso Not Char.IsControl(e.KeyChar) Then
            e.KeyChar = ""
End If

삭제 키를 사용하고 소수점을 설정할 수 있습니다.

이 게시물이 오래된 것은 알지만 텍스트박스를 IntBox라고 부르는 것으로 바꾸기 위해 구현한 것을 공유하고 싶습니다.

먼저 다음을 사용하여 확장해야 합니다.

<Runtime.CompilerServices.Extension()> _
Public Function HandledStringtoInteger(s As String) As Integer
    Try
        If s = String.Empty Then
            Return 0
        Else
            Return Integer.Parse(s)
        End If
    Catch
        Dim result As String = String.Empty
        Dim ReturnInt As Integer
        Dim Parsed As Integer
        For Each Character In s.ToCharArray
            If Character = "-" Then
                If s.Substring(0, 1).ToString <> "-" Then
                    result = Character + result
                End If
            End If
            If Character = "." Then
                Exit For
            End If
            If Integer.TryParse(Character, Parsed) Then
                result = result + Parsed.ToString
            End If
        Next
        If result <> String.Empty Then
            If Integer.TryParse(result, ReturnInt) Then
                Return Integer.Parse(ReturnInt)
            Else
                If Double.Parse(result) > Double.Parse(Integer.MaxValue.ToString) Then
                    Return Integer.MaxValue
                ElseIf Double.Parse(result) < Double.Parse(Integer.MinValue.ToString) Then
                    Return Integer.MinValue
                Else
                    Return Integer.Parse(ReturnInt)
                End If
            End If
        Else
            Return 0
        End If
    End Try
End Function

그런 다음 TextChanged 이벤트 하위 항목을 만듭니다.

Private Sub TextBox_to_IntBox(sender As Object, e As TextChangedEventArgs) Handles YourTextBox.TextChanged
    If DirectCast(sender, TextBox).IsKeyboardFocused Then
        DirectCast(sender, TextBox).Text = DirectCast(sender, TextBox).Text.HandledStringtoInteger
        DirectCast(sender, TextBox).CaretIndex = DirectCast(sender, TextBox).Text.Length
    End If
End Sub

그런 다음 사용자가 텍스트를 입력할 때마다 문자열을 평가하고 표준 정수 범위 내에 있는 숫자 값만 반환합니다."-" 문자를 사용하여 정수를 양수에서 음수로 변경하고 다시 되돌릴 수 있습니다.

이 코드를 개선할 수 있는 것을 발견한 사람이 있으면 알려주십시오. 하지만 제 테스트는 IntBox를 만드는 데 환상적인 작동을 보여줍니다.

편집: 코드에서 속성을 사용할 경우 작동할 수 있는 다른 방법을 찾았습니다.(TextBox마다 별도의 속성이 필요합니다.)

먼저 속성을 만듭니다.

Public Class Properties
    Implement INotifyPropertyChanged

    Private _Variable as Integer
    Public Property YourProperty as Object
    get
      Return _Variable
    end get
    set(value as Object)
      _Variable = value.ToString.ToInteger 'I will give the ToInteger extension code later
    end set
    end property
Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged

Public Sub OnPropertyChange(ByVal e As PropertyChangedEventArgs)
    If Not PropertyChangedEvent Is Nothing Then
        RaiseEvent PropertyChanged(Me, e)
    End If
End Sub
End Class

그런 다음 창의 기본 클래스에서 바인딩을 만듭니다.

Public WithEvents _YourVariable as New Properties

Public Sub New()
    InitializeComponent()
With YourTextBox
  .SetBinding(Textbox.TextProperty, New Binding("YourProperty"))
  .DataContext = _YourVariable
End With
End Sub

마지막으로 설정한 ToInteger 확장 코드는 다음과 같습니다.

''' <summary>
''' Handles conversion of variable to Integer.
''' </summary>
''' <param name="X"></param>
''' <param name="I">Returned if conversion fails.</param>
''' <returns>Signed 32bit Integer</returns>
''' <remarks></remarks>
<Runtime.CompilerServices.Extension()> _
Public Function toInteger(Of T)(ByRef X As T, Optional I As Integer = 0) As Integer
    Dim S As String = X.ToString
    Try
        If S = String.Empty Then
            Return I
        Else
            Return Integer.Parse(S)
        End If
    Catch
        Dim result As String = String.Empty
        Dim ReturnInt As Integer
        Dim Parsed As Byte
        For Each Character In S.ToCharArray
            If Character = "-" Then
                If S.Substring(0, 1).ToString <> "-" Then
                    result = Character + result
                End If
            End If
            If Character = "." Then
                Exit For
            End If
            If Byte.TryParse(Character, Parsed) Then
                result = result + Parsed.ToString
            End If
        Next
        If result <> String.Empty Then
            If Integer.TryParse(result, ReturnInt) Then
                Return Integer.Parse(ReturnInt)
            Else
                If Double.Parse(result) > Double.Parse(Integer.MaxValue.ToString) Then
                    Return Integer.MaxValue
                ElseIf Double.Parse(result) < Double.Parse(Integer.MinValue.ToString) Then
                    Return Integer.MinValue
                Else
                    Return Integer.Parse(ReturnInt)
                End If
            End If
        Else
            Return I
        End If
    End Try
End Function

이 모든 것이 결합되어 상자에 무언가를 입력할 때마다 텍스트 상자처럼 작동하지만 포커스가 변경되면 ToInteger 확장자가 값을 속성에 정수로 설정하고 텍스트 상자로 반환합니다.

즉, 포커스가 변경된 후 "-1w3"을 입력하면 자동으로 "-13"으로 돌아갑니다.

너무 늦었을 수도 있지만, VB에 있는 다른 새로운 혈액들을 위해, 여기 간단한 것이 있습니다.

첫째, 응용 프로그램에서 필요로 하지 않는 한 사용자의 키 입력을 차단하는 것은 좋지 않습니다. 사용자는 작업을 하드웨어 키보드의 문제로 잘못 해석하고 동시에 키 입력 오류가 어디서 발생했는지 알 수 없습니다.

여기 간단한 것이 있습니다. 사용자가 자유롭게 입력한 다음 나중에 오류를 트랩할 수 있습니다.

  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim theNumber As Integer
        Dim theEntry As String = Trim(TextBox1.Text)

        'This check if entry can be converted to
        'numeric value from 0-10, if cannot return a negative value.
        Try
            theNumber = Convert.ToInt32(theEntry)
            If theNumber < 0 Or theNumber > 10 Then theNumber = -1
        Catch ex As Exception
            theNumber = -1
        End Try

        'Trap for the valid and invalid numeric number
        If theNumber < 0 Or theNumber > 10 Then
            MsgBox("Invalid Entry, allows (0-10) only.")
            'entry was invalid return cursor to entry box.
            TextBox1.Focus()
        Else
            'Entry accepted:
            ' Continue process your thing here...

        End If
    End Sub

저는 텍스트가 1에서 10 범위인지 확인할 솔루션을 가지고 있습니다: [1-9]는 1에서 9 범위를 확인할 것입니다.저는 10개를 확인하기 위해 한 가지 조건을 더 사용합니다.

If txtBox.Text Like "[1-9]" Or txtBox.Text Like "10" Then
        MessageBox.Show("true")
    Else
        MessageBox.Show("false")
End If

먼TextBox 정을 합니다.MaxLength 로입텍력 2니다제합의 합니다.TextBox그러면 를 사용하여 이와 같은 것을 시도할 수 있습니다. 당신은 최대 2자리 숫자(10)를 사용하기 때문에 당신은 다음과 같은 것을 사용해야 할 것입니다.Key를 들면Enter검사를 시작합니다.

Private Sub TextBox1_KeyPress(sender As System.Object, e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress
    Dim tb As TextBox = CType(sender, TextBox)
    If Not IsNumeric(e.KeyChar) Then    'Check if Numeric
        If Char.IsControl(e.KeyChar) Then  'If not Numeric Check if a Control
            If e.KeyChar = ChrW(Keys.Enter) Then
                If Val(tb.Text) > 10 Then  'Check Bounds
                    tb.Text = ""
                    ShowPassFail(False)
                Else
                    ShowPassFail(True)
                End If
                e.Handled = True
            End If
            Exit Sub
        End If
        e.Handled = True
        ShowPassFail(False)
    End If
End Sub

Private Sub ShowPassFail(pass As Boolean)
    If pass Then
        MessageBox.Show("Thank you, your rating was " & TextBox1.Text)
    Else
        MessageBox.Show("Please Enter a Number from 1 to 10")
    End If
    TextBox1.Clear()
    TextBox1.Focus()
End Sub
Public Function Isnumber(ByVal KCode As String) As Boolean
    If Not Isnumeric(KCode) And KCode <> ChrW(Keys.Back) And KCode <> ChrW(Keys.Enter) And KCode <> "."c Then

        MsgBox("Please Enter Numbers only", MsgBoxStyle.OkOnly)
    End If
End Function

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

    If Not Isnumber(e.KeyChar) Then
        e.KeyChar = ""
    End If

End Sub

이건 나한테 효과가 있었어요선택하지 않은 키를 누르면 텍스트 상자가 완전히 지워집니다.

Private Sub TextBox2_TextChanged(sender As Object, e As EventArgs) Handles TextBox2.TextChanged
    If IsNumeric(TextBox2.Text) Then
        'nada
    Else
        TextBox2.Clear()
    End If
End Sub

이 기능을 vb.net 프로젝트 내의 모든 모듈에 복사합니다.

Public Function MakeTextBoxNumeric(kcode As Integer, shift As Boolean) As Boolean
    If kcode >= 96 And kcode <= 105 Then

    ElseIf kcode >= 48 And kcode <= 57
        If shift = True Then Return False
    ElseIf kcode = 8 Or kcode = 107 Then

    ElseIf kcode = 187 Then
        If shift = False Then Return False
    Else
        Return False
    End If
    Return True
End Function

그런 다음 아래와 같이 textbox_keydown 이벤트 내에서 이 함수를 사용합니다.

Private Sub txtboxNumeric_KeyDown(sender As Object, e As KeyEventArgs) Handles txtboxNumeric.KeyDown
If MakeTextBoxNumeric(e.KeyCode, e.Shift) = False Then e.SuppressKeyPress = True
End Sub

그리고 네.100% 효과가 있습니다 :)

텍스트 상자의 온다운 속성을 사용하여 값을 숫자로만 제한할 수 있습니다.

<asp:TextBox ID="TextBox1" runat="server" onkeydown = "return (!(event.keyCode>=65) && event.keyCode!=32);"></asp:TextBox>

!(keyCode>=65)를 선택하면 알파벳이 제외됩니다.

키코드!=32 체크는 숫자 사이에 공백 문자를 제외하는 것입니다.

기호를 텍스트 상자에 입력하지 않으려면 아래 조건도 'onkeydown' 속성에 포함합니다.

!(event.shiftKey && (event.keyCode >= 48 && event.keyCode <= 57))

따라서 TextBox가 됩니다.

<asp:TextBox ID="TextBox1" runat="server" onkeydown = "return (!(event.keyCode>=65) && event.keyCode!=32 && !(event.shiftKey && (event.keyCode >= 48 && event.keyCode <= 57)));"></asp:TextBox>

설명:

'a'의 키코드는 '65'이고 'z'는 '90'입니다.

다른 기호인 '90'부터 '222'까지의 키 코드도 필요하지 않습니다.

'Space' Key의 KeyCode는 '32'이며, 이 역시 필요하지 않습니다.

그러면 'Shift' 키와 'Number' 키(기호를 나타냄)의 조합도 필요하지 않습니다.'0'의 키코드는 '48'이고 '9'는 '57'입니다.

따라서 이 모든 것은 원하는 결과를 생성하는 TextBox 선언 자체에 포함됩니다.

한번 보세요.

이게 내 마지막...또한 다음과 같은 모든 유형 문제를 해결합니다.

다음은 숫자가 필요한 간단한 텍스트 상자입니다.

   public Sub textbox_memorytotal_TextChanged(sender As Object, e As EventArgs) Handles textbox_memorytotal.TextChanged
        TextboxOnlyNumbers(sender)
    End Sub

모든 잘못된 입력을 수정하는 절차는 다음과 같습니다.

Public Sub TextboxOnlyNumbers(ByRef objTxtBox As TextBox)

    ' ONLY allow numbers
    If Not IsNumeric(objTxtBox.Text) Then

        ' Don't process things like too many backspaces
        If objTxtBox.Text.Length > 0 Then

            MsgBox("Numerical Values only!")

            Try
                ' If something bad was entered delete the last character
                objTxtBox.Text = objTxtBox.Text.Substring(0, objTxtBox.Text.Length - 1)

                ' Put the cursor and the END of the corrected number
                objTxtBox.Select(objTxtBox.Text.Length + 1, 1)

            Catch ex As Exception
            End Try
        End If
    End If
End Sub

텍스트 상자 키다운 이벤트에 사용합니다.

Private Sub TextBox1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyDown
    'you can enter decimal "if nonNumberEntered(e, TextBox1, True) then" 
    'otherwise just numbers "if nonNumberEntered(e, TextBox1) then"
    If nonNumberEntered(e, TextBox1, True) Then
        e.SuppressKeyPress = True
    End If
    If e.KeyCode = Keys.Enter Then
        'put your code here
    End If

End Sub

이 기능을 vb.net 프로젝트 내의 모든 모듈에 복사합니다.

Public Function nonNumberEntered(ByVal e As System.Windows.Forms.KeyEventArgs, _
                          ByVal ob As TextBox, _
                          Optional ByVal decim As Boolean = False) As Boolean
    nonNumberEntered = False

    If decim Then
        ' Determine whether the keystroke is a number from the top of the keyboard.
        If e.KeyCode < Keys.D0 OrElse e.KeyCode > Keys.D9 Then
            ' Determine whether the keystroke is a number from the keypad.
            If e.KeyCode < Keys.NumPad0 OrElse e.KeyCode > Keys.NumPad9 Then
                If e.KeyCode <> Keys.Decimal And e.KeyCode <> Keys.OemPeriod Then
                    If e.KeyCode <> Keys.Divide And e.KeyCode <> Keys.OemQuestion Then
                        ' Determine whether the keystroke is a backspace.
                        If e.KeyCode <> Keys.Back And e.KeyCode <> Keys.Delete _
                        And e.KeyCode <> Keys.Left And e.KeyCode <> Keys.Right Then
                            ' A non-numerical keystroke was pressed. 
                            nonNumberEntered = True
                        End If
                    ElseIf ob.Text.Contains("/") Or ob.Text.Length = 0 Then
                        nonNumberEntered = True
                    End If
                ElseIf ob.Text.Contains(".") Or ob.Text.Length = 0 Then
                    nonNumberEntered = True
                End If
            End If
        End If
    Else
        ' Determine whether the keystroke is a number from the top of the keyboard.
        If e.KeyCode < Keys.D0 OrElse e.KeyCode > Keys.D9 Then
            ' Determine whether the keystroke is a number from the keypad.
            If e.KeyCode < Keys.NumPad0 OrElse e.KeyCode > Keys.NumPad9 Then
                ' Determine whether the keystroke is a backspace.
                If e.KeyCode <> Keys.Back And e.KeyCode <> Keys.Delete _
                    And e.KeyCode <> Keys.Left And e.KeyCode <> Keys.Right Then
                    ' A non-numerical keystroke was pressed. 
                    nonNumberEntered = True
                End If
            End If
        End If
    End If

    'If shift key was pressed, it's not a number.
    If Control.ModifierKeys = Keys.Shift Then
        nonNumberEntered = True
    End If

End Function

이렇게 하면 "nonNumberEntered(e,Textbox1,True)"라는 데심을 사용하는 경우 2/4 또는 3.5와 같은 숫자를 텍스트 상자에 입력할 수 있습니다.

"nonNumberEntered(e,Textbox1,False)" 또는 "nonNumberEntered(e,Textbox1)"를 사용하는 경우 텍스트 상자에 숫자만 입력할 수 있습니다.

편집: 텍스트가 추가되었습니다.

최근에 비슷한 사용 요구사항이 있었습니다.TextBox숫자만 입력할 수 있습니다.

결국 나는 a를 사용했습니다.MaskedTextBox신에대 TextBox텍스트 상자에 대해 "마스크"를 정의하면 사용자가 정의한 문자(이 경우 숫자)만 허용됩니다.단점은 그것이 내부에 약간의 추악한 선을 남겼다는 것입니다.TextBox;

텍스트 마스크

내가 좋아하는 것은MaskedTextBox그것이 그렇게 커스터마이즈 가능했는지.만약, 어떤 이유로 당신이 원했다면,TextBox과 23 int 형의입력 2 식의수려 2 문하면락, ▁the▁int▁3▁to▁in▁you다것니입▁set▁input▁an▁is▁of▁format,는▁all▁to▁3▁the하정▁accept▁do▁need▁int▁only설▁letterss를 설정하기만 하면 됩니다.TextMask000LLVisual Studio에는 사전 정의된 마스크가 많이 있으며 전체 설명서는 여기에서 확인할 수 있습니다.

미리 정의된 마스크

자, 이것이 당신의 문제를 완전히 해결하지는 않는다는 것을 알지만, 사용하는 것은MaskedTextBox문제의 복잡성의 상당 부분을 제거합니다. 이다음내보수있다습니의 할 수 .MaskedTextBox으로도 계속 로만 될 입니다.Int 단순실허를 할 수 허용If이 을값보기위진술한하장▁the진▁to술▁statement▁ensure▁is▁value위한기라는 것을 확인하는 문장.=<10

이 게시물이 오래된 것은 알지만 코드를 공유하고 싶습니다.

 Private Sub txtbox1_TextChanged(sender As Object, e As EventArgs) Handles txtbox1.TextChanged
    If txtbox1.Text.Length > 0 Then
        If Not IsNumeric(txtbox1.Text) Then
            Dim sel As Integer = txtbox1.SelectionStart
            txtbox1.Text = txtbox1.Text.Remove(sel - 1, 1)
            txtbox1.SelectionStart = sel - 1
        End If
    End If
End Sub

텍스트 상자의 각 항목(이벤트 - 처리 제한됨)텍스트 상자.TextChanged), 입력한 텍스트를 정수로 카스트할 수 있습니다. 실패할 경우 제한된 텍스트 값을 재설정합니다.TextBox - 마지막 유효한 항목(temp1 변수에서 지속적으로 업데이트됨).

다음은 그 방법입니다.me.load 또는 mybase.load 형식으로 로드되는 하위에서 temp1을 기본값인 Restricted로 초기화합니다.텍스트 상자.본문

Dim temp1 As Integer 'initialize temp1 default value, you should do this after the default value for RestrictedTextBox.Text was loaded.
If (RestrictedTextBox.Text = Nothing) Then 
    temp1 = Nothing
Else
    Try 
        temp1 = CInt(RestrictedTextBox.Text)
    Catch ex As Exception
        temp1 = Nothing
    End Try
End If   

형태의 다른 지점:

Private Sub textBox_TextChanged(sender As System.Object, e As System.EventArgs) Handles RestrictedTextBox.TextChanged
    Try
        temp1 = CInt(RestrictedTextBox.Text) 'If user inputs integer, this will succeed and temp will be updated
    Catch ex As Exception
        RestrictedTextBox.Text = temp1.ToString 'If user inputs non integer, textbox will be reverted to state the state it was in before the string entry
    End Try
End Sub

이것의 좋은 점은 이것을 사용하여 텍스트 상자를 더블, unint 등 원하는 모든 유형으로 제한할 수 있다는 것입니다.

모든 텍스트 상자에는 다음과 같이 사용할 수 있는 유효성 검사 유효성 검사 이벤트가 있습니다.

Private Sub PriceTxt_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles PriceTxt.Validating
                If Not IsNumeric(PriceTxt.Text) Then
                 PriceTxt.BackColor = Color.Red
                 MsgBox("The Price Should Be Numeric Only , Enter Again", vbCritical)
                 PriceTxt.Text = ""
                 PriceTxt.BackColor = Color.White
                End If
End Sub

오래된 거 알아요편의를 위해 이 코드를 그냥 여기에 두겠습니다.

정수만:

Public Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
   With TextBox1
      If IsNumeric(.Text) Then .Text = .Text.Select(Function(x) If(IsNumeric(x), x, "")) : .SelectionStart = .TextLength
   End With
   ' etc..
End Sub

수락을 합니다.Double:

Public Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
   With TextBox1
      If IsNumeric(.Text) Then .Text = .Text.Select(Function(x) If(IsNumeric(x) Or x = ".", x, "")) : .SelectionStart = .TextLength
   End With
   ' etc..
End Sub

을 수락합니다.+ - * /, 호괄( ) [ ] { }그리고.Double:

Public Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
   With TextBox1
      If IsNumeric(.Text) Then .Text = .Text.Select(Function(x) If(IsNumeric(x) Or ".+-*/()[]{}".Contains(x), x, "")) : .SelectionStart = .TextLength
   End With
   ' etc..
End Sub

팔로우 코드 텍스트 상자 키 누르기 이벤트를 사용할 수 있습니다.

Private Sub txtbox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtbox1.KeyPress
    Try
        If Val(txtbox1.text) < 10 Then
            If Char.IsLetterOrDigit(e.KeyChar) = False And Char.IsControl(e.KeyChar) = False Then
                e.Handled = True
            End If
        Else
            e.Handled = True
        End If
    Catch ex As Exception
        ShowException(ex.Message, MESSAGEBOX_TITLE, ex)
    End Try
End Sub

이 코드는 숫자만 허용하며 1에서 10 사이의 숫자만 입력할 수 있습니다.

저에게 맞는 아주 간단한 코드입니다.

 Private Sub Textbox1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles textbox1.KeyPress
        If Asc(e.KeyChar) > 58 Then
            e.KeyChar = ""

        End If
    End Sub

제게 도움이 되는 것은 이렇습니다.키보드의 맨 위 행과 숫자 패드의 숫자뿐만 아니라 백스페이스, 델도 사용할 수 있습니다.+ 및 - 기호는 제외됩니다.

    Private Sub tbMQTTPort_KeyDown(sender As Object, e As KeyEventArgs) Handles tbMQTTPort.KeyDown

      Dim kc As New KeyConverter
      Dim Regex = New Regex("[^0-9]+")
      e.Handled = Regex.IsMatch(kc.ConvertToInvariantString(e.Key).Replace("NumPad", ""))

    End Sub

언급URL : https://stackoverflow.com/questions/9969824/vb-net-need-text-box-to-only-accept-numbers

반응형