现在,我为每个特定的用户输入设置一条消息,然后将其显示在“结果标签”中。该函数需要返回一个布尔值。我一直在努力清理我的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
答案 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
。