VB Ввод значения Non_Numeri c приводит к сбою программы - PullRequest
0 голосов
/ 30 мая 2020

Пожалуйста, подумайте о добавлении описания к этому вопросу, чтобы привлечь больше полезных ответов.

Public Class Form1
    Private Sub BtnCalculateRevenue_Click(sender As Object, e As EventArgs) Handles BtnCalculateRevenue.Click
        Dim intvalue As Integer = CInt(TxtInputClassA.Text)
        Dim intvalue2 As Integer = CInt(TxtInputClassB.Text)
        Dim intvalue3 As Integer = CInt(TxtinputClassC.Text)
        Dim total As Double
        Try
            LblStatus.Text = String.Empty

            LblClassAResult.Text = (intvalue * 15).ToString("c")
            LblClassBResult.Text = (intvalue2 * 12).ToString("c")
            LblClassCResult.Text = (intvalue3 * 9).ToString("c")
            total = CDbl((intvalue * 15) + (intvalue2 * 12) + (intvalue3 * 9))
            LblTotal.Text = total.ToString("c")
        Catch
            LblStatus.Text = "Please Enter a Number"
        End Try
    End Sub

    Private Sub BtnExit_Click(sender As Object, e As EventArgs) Handles BtnExit.Click
        Me.Close()
    End Sub

    Private Sub BtnClear_Click(sender As Object, e As EventArgs) Handles BtnClear.Click
        TxtInputClassA.Clear()
        TxtInputClassB.Clear()
        TxtinputClassC.Clear()
        LblClassAResult.Text = String.Empty
        LblClassBResult.Text = String.Empty
        LblClassCResult.Text = String.Empty
        LblTotal.Text = String.Empty
    End Sub
End Class

VB Ввод значения Non_Numeri c приводит к сбою программы

Ответы [ 3 ]

2 голосов
/ 30 мая 2020

Проверка встроена прямо в формы Windows, поэтому вам следует ее использовать. Если вы хотите заставить пользователя вводить числа в каждый из трех TextBoxes, вы можете сделать это:

Private Sub TextBoxes_Validating(sender As Object, e As ComponentModel.CancelEventArgs) Handles TextBox3.Validating, TextBox2.Validating, TextBox1.Validating
    Dim tb = DirectCast(sender, TextBox)

    If Not Integer.TryParse(tb.Text, Nothing) Then
        'Select all the invalid text and highlight it.
        tb.SelectAll()
        tb.HideSelection = False

        MessageBox.Show("Please enter a whole number",
                        "Invalid Input",
                        MessageBoxButtons.OK,
                        MessageBoxIcon.Exclamation)

        'Remove highlight when TextBox is not focused.
        tb.HideSelection = True

        'Don't let the control lose focus while data is invalid.
        e.Cancel = True
    End If
End Sub

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    If ValidateChildren() Then
        'All data is valid  so proceed.
        Dim n1 = CInt(TextBox1.Text)
        Dim n2 = CInt(TextBox2.Text)
        Dim n3 = CInt(TextBox3.Text)

        '...
    End If
End Sub

Метод ValidateChildren вызовет событие Validating для каждого элемента управления в форме и вернуть False, если проверка не прошла, т.е. e.Cancel установлено в True в любых обработчиках событий, чтобы гарантировать, что даже элементы управления, которые никогда не получали фокус, будут проверены перед использованием данных.

1 голос
/ 30 мая 2020

Замените текстовые поля элементами управления NumericUpDown и получите их .Value для своих вычислений. NUD не допускают ввод без числа c и могут иметь фиксированное количество десятичных знаков, что также может быть полезно в финансовом контексте

1 голос
/ 30 мая 2020

Его взорвало ваш бросок «CInt(*value*)», так что вы можете исправить код парой способов. Вы можете переместить свою попытку над приведениями, например ...

Try
    Dim intvalue As Integer = CInt(TxtInputClassA.Text)
    Dim intvalue2 As Integer = CInt(TxtInputClassB.Text)
    Dim intvalue3 As Integer = CInt(TxtinputClassC.Text)
    Dim total As Double
    LblStatus.Text = String.Empty

Вы можете выполнить проверку данных на своих входах и выйти, если они не все числа c (поместите это над кодом Dim intvalue )

    For Each value As String In {TxtInputClassA.Text, TxtInputClassA.Text, TxtInputClassA.Text}
        If Not IsNumeric(TxtInputClassA.Text) Then
            LblStatus.Text = "Please Enter a Number"
            Exit Sub
        End If
    Next

Вместо преобразования в тип int используйте метод tryparse для Int32 ...

    Dim intvalue As Integer
    If Not Int32.TryParse(TxtInputClassA.Text, intvalue) Then
        Exit Sub
    End If

Или вы можете перехватывать нажатия клавиш в каждом текстовом поле, чтобы можно было только числа

Private Sub TxtInputClassA_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TxtInputClassA.KeyPress

    If Not Char.IsDigit(e.KeyChar) Then
        e.Handled = True
    End If

End Sub

Вы можете сделать эту процедуру универсальной и добавить обработчик событий для всех трех текстовых полей, например ...

Private Sub EnforceOnlyNumericKeyPresses(sender As Object, e As KeyPressEventArgs) Handles TxtInputClassA.KeyPress, TxtInputClassB.KeyPress, TxtInputClassC.KeyPress

    If Not Char.IsDigit(e.KeyChar) Then
        e.Handled = True
    End If

End Sub

Выберите свой любимый или сделайте все, много выбора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...