基于用户输入返回布尔值的验证方法

时间:2020-03-23 02:23:35

标签: vb.net

现在,我为每个特定的用户输入设置一条消息,然后将其显示在“结果标签”中。该函数需要返回一个布尔值。我一直在努力清理我的if语句。试图在此Validation函数中找到更简洁的逻辑方法。截至目前,这就是我所拥有的。

    Private Function UserInputValidation() As Boolean

    Dim isValid As Boolean = True
    Dim inputError As String = String.Empty
    Dim price As Double

    If cmbMake.SelectedIndex = -1 Then
        inputError += "" & vbCrLf
    End If

    If txtModel.Text.Trim.Length = 0 Then
        inputError += "" & vbCrLf
    End If

    If cmbYear.SelectedIndex = -1 Then
        inputError += "" & vbCrLf
    End If

    If txtPrice.Text.Trim.Length = 0 Then
        inputError += "" & vbCrLf
    Else
        If Double.TryParse(txtPrice.Text.Trim, price) = False OrElse price < 0.0 Then
            txtPrice.Clear()
            inputError += ""
        End If
    End If

    If inputError <> String.Empty Then
        isValid = False
        lblError.Text = inputError
    End If

    Return isValid

End Function

2 个答案:

答案 0 :(得分:0)

好吧,首先,使用&=来连接字符串而不是+=。两种形式都可以使用,但是&=有优势,而+=没有优势,可能会让您崩溃自己的应用程序。

如果您想真正摆脱困境,请使用StringBuilder。对于您来说,程序员没有什么大的不同,但是您的计算机将使用较少的资源。

现在,编写语句的方式可以让未使用的空行位于语句末尾。您可以通过这样编写代码来解决此问题(假设您使用的是System.Text.StringBuilder):

    Dim inputError As System.Text.StringBuilder
    If TestForSomething Then
        inputError.AppendLine("This is an error message")
    End If

最后,您可以编写:

    If inputError.Trim.Length > 0 Then
        lblError.Text = inputError.ToString
    End If

    Return inputError.ToString = "" 'you don't really need the isValid variable

验证txtPrice可能会更干净,但是我不确定您是否每种情况都有不同的错误消息,或者只是使用一般的“价格错误”消息,所以我不会细节。

您正在做的事情似乎还可以。没有十亿种方法可以做您正在做的事情,并且您有正确的想法。其余的都在挑剔,就像我建议您将您的字符串与""进行比较,而不是检查长度...但是两者都可以。

玩得开心。

答案 1 :(得分:0)

我强烈建议您使用WinForms内置的验证功能。您应该处理每个控件的Validating事件,并在那里验证该控件。如果要以相同的方式验证多个控件,请使用公共事件处理程序并使用sender确定它是哪个控件。您可以调用表单上的ValidateChildren来验证所有控件,即使它们没有获得焦点。例如

Imports System.ComponentModel

Public Class Form1

    Private ReadOnly errorMessagesByControl As New Dictionary(Of Control, String)

    Private Sub NumericTextBoxes_Validating(sender As Object, e As CancelEventArgs) Handles TextBox1.Validating, TextBox2.Validating
        Dim control = DirectCast(sender, Control)

        'Check that the field contains a number.
        If Double.TryParse(control.Text, Nothing) Then
            'Remove existing error message on successful validation.
            errorMessagesByControl.Remove(control)
        ElseIf Not errorMessagesByControl.ContainsKey(control) Then
            'Add error message if one does not already exist.
            errorMessagesByControl.Add(control, $"Please enter a number in the {control.Tag} field.")
        End If

        DisplayErrorMessages()
    End Sub

    Private Sub TextBox3_Validating(sender As Object, e As CancelEventArgs) Handles TextBox3.Validating
        If TextBox3.TextLength = 0 Then
            errorMessagesByControl.Add(TextBox3, $"Please enter some text in the {TextBox3.Tag} field.")
        ElseIf Not errorMessagesByControl.ContainsKey(TextBox3) Then
            errorMessagesByControl.Remove(TextBox3)
        End If

        DisplayErrorMessages()
    End Sub

    Private Sub DisplayErrorMessages()
        Label1.Text = String.Join(Environment.NewLine, errorMessagesByControl.Values)
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        If ValidateChildren() Then
            'All fields passed validation so use the data with confidence.
        End If
    End Sub

End Class

这假定每个控件的Tag都填充有要在错误消息中显示的字段名称。当前所有错误消息均存储在Dictionary中,因此可以轻松添加和删除它们。每次进行验证时,都会合并并显示错误消息。

您还可以考虑使用ErrorProvider来显示针对单个控件的错误,而不是使用单个Label