Проверка, является ли число целым, прежде чем сравнивать их не работает в VB Net

Я новичок в VB Net, и я пытался создать программу, которая проверяет 2 ввода текстового поля:

У меня есть опыт работы с MS Access vba, где мы можем заставить окно ввода принимать только цифры. Но я узнал, что это невозможно в VB.net. Итак, я провел некоторое исследование для целочисленной проверки и придумал это:

Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Me.txtTeam1.Text = 0
        Me.txtTeam2.Text = 0
    End Sub

    Private Sub txtTeam1_TextChanged(sender As Object, e As EventArgs) Handles txtTeam1.TextChanged
        If checkType(Me.txtTeam1.Text) = True Then
            changeBackColor()
        Else
            MessageBox.Show("Invlaid Entry", "Please Enter a number")
        End If
    End Sub

    Private Sub txtTeam2_TextChanged(sender As Object, e As EventArgs) Handles txtTeam2.TextChanged
        If checkType(Me.txtTeam2.Text) = True Then
            changeBackColor()
        Else
            MessageBox.Show("Invlaid Entry", "Please Enter a number")
        End If
    End Sub

    Function changeBackColor()
        Try
            If Convert.ToInt32(Me.txtTeam1.Text) < Convert.ToInt32(Me.txtTeam2.Text) Then
                Me.txtTeam1.BackColor = Color.Gray
                Me.txtTeam2.BackColor = Color.Green
            ElseIf CInt(Me.txtTeam1.Text) > CInt(Me.txtTeam2.Text) Then
                Me.txtTeam1.BackColor = Color.Green
                Me.txtTeam2.BackColor = Color.Gray
            Else
                'Both are equal
                Me.txtTeam1.BackColor = Color.Gray
                Me.txtTeam2.BackColor = Color.Gray
            End If
        Catch ex As Exception
            MessageBox.Show("Invlaid Entry", "Please Enter a number")
        End Try

    End Function

    Function checkType(num As String) As Boolean
        Try
            Convert.ToInt32(num)
            Return True
        Catch ex As Exception
            Return False
        End Try
    End Function

End Class

Тем не менее, как только форма загружается, я получаю сообщение о недопустимом вводе, даже если значение по умолчанию равно 0. Даже когда я ввожу допустимое число в любом из текстовых полей, я получаю недопустимое входное сообщение

Всего 2 ответа


Вы можете использовать метод Integer.TryParse чтобы проверить, может ли строка быть проанализирована как целое число, и она не выдает исключение, если не может, она просто возвращает True, если она может проанализировать строку в число, и помещает значение во втором параметре, в противном случае он возвращает False и устанавливает для второго параметра значение 0 (фактически он использует значение по умолчанию типа переменной второго параметра).

Если вы не хотите, чтобы поля меняли цвет в зависимости от типа пользователя, вы можете использовать событие Validating вместо события TextChanged.

Кроме того, вы можете контролировать применение обработчика событий, удалив часть AddHandler Handles ... и добавив его вручную с помощью команды AddHandler . Это не позволит жаловаться в тот момент, когда вы установили txtTeam1.Text = "0" но перед установкой другого текстового поля. Вы даже можете использовать только один обработчик событий для обработки более одного события, например так:

Public Class Form1

    Sub ChangeBackColors()
        Dim team1 = 0
        Dim team2 = 0

        If Integer.TryParse(txtTeam1.Text, team1) AndAlso Integer.TryParse(txtTeam2.Text, team2) Then

            If team1 < team2 Then
                Me.txtTeam1.BackColor = Color.Gray
                Me.txtTeam2.BackColor = Color.Green
            ElseIf team1 > team2 Then
                Me.txtTeam1.BackColor = Color.Green
                Me.txtTeam2.BackColor = Color.Gray
            Else
                'Both are equal
                Me.txtTeam1.BackColor = Color.Gray
                Me.txtTeam2.BackColor = Color.Gray
            End If

        Else
            MessageBox.Show("Invalid Entry", "Please enter a whole number.")

        End If

    End Sub

    Private Sub txtTeam_Validating(sender As Object, e As EventArgs)
        ChangeBackColors()

    End Sub

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        txtTeam1.Text = "0"
        txtTeam2.Text = "0"

        AddHandler txtTeam1.Validating, AddressOf txtTeam_Validating
        AddHandler txtTeam2.Validating, AddressOf txtTeam_Validating

    End Sub

End Class

Вы могли бы сделать что-то вроде этого.

    Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
    If System.Text.RegularExpressions.Regex.IsMatch(TextBox1.Text, "[^0-9]") Then
        MessageBox.Show("Please enter only numbers.")
        TextBox1.Text = TextBox1.Text.Remove(TextBox1.Text.Length - 1)
    End If
    End Sub

Если вы хотите узнать больше, вы можете взглянуть на это. Как сделать текстовое поле, которое принимает только цифры?


Есть идеи?

10000