我有一个包含3个文本框的表单,txt_customeracc,txt_customername,txt_customercontact
这3个文本框是可选的,默认情况下,文本框将包含" N / A"在表单加载时显示,但如果用户将信息输入其中一个,我希望他们也在其他两个框中输入信息。
我正在使用的代码在
之下If txt_customername.Text <> "" Or txt_customername.Text <> "N/A" Or
txt_customercontact.Text <> "" Or txt_customercontact.Text <> "N/A" And
txt_customeracc.Text = "" Or txt_customeracc.Text = "N/A"
Then error1 += vbNewLine & "Please enter a correct Customer Account Number"
所以从上面的代码我希望如果用户在txt_customername或txt_customercontact文本框中输入信息但不在txt_customeracc框中输入信息,则会出现警告但当前警告消息正在显示,无论信息是或是没有进入任何一个方框。谁能告诉我我做错了什么?
答案 0 :(得分:2)
什么是运算符优先级?
您的主要问题是operator precedence存在问题。那是什么?
这与进行计算时完全相同,乘法首先出现,然后是加法。在VB .NET中,And
运算符出现在Or
之前,因此您在代码中编写的内容的评估如下:
If txt_customername.Text <> "" Or
txt_customername.Text <> "N/A" Or
txt_customercontact.Text <> "" Or
(txt_customercontact.Text <> "N/A" And txt_customeracc.Text = "") Or
txt_customeracc.Text = "N/A"
Then
error1 += vbNewLine & "Please enter a correct Customer Account Number"
End If
由于这不是你想要的,所以让我们一起构建:
customername
或 customercontact
已填满和强>
customeracc
为空那会给我们:
if (
(txt_customername.Text <> "" Or txt_customername.Text <> "N/A") 'CustomerName is filled up
Or
(txt_customercontact.Text <> "" Or txt_customercontact.Text <> "N/A") 'Customer Contact is filled up
)
And
(txt_customeracc.Text = "" Or txt_customeracc.Text = "N/A") 'Customer account is empty
Then
'Do whatever
End If
让它变得更好,调用函数
此处的另一个问题是可读性,此代码可能有错误,因为它难以阅读,因此难以调试。
我们可以做的是构建一个函数来检查文本框是否为空:
Private Function IsEmpty(Tb As Textbox) As Boolean
'Here we return true if tb.Text is empty or contains "N/A"
Return Tb.Text = "" Or Tb.Text = "N/A"
End Function
这样可以使它更具可读性:
if (Not IsEmpty(txt_customername) Or Not IsEmpty(txt_customercontact)) 'CustomerName or Customer Contact is filled up
And IsEmpty(txt_customeracc) 'Customer account is empty
Then
'Do whatever
End If
让它更好(2),比较字符串
正如zaggler在评论中所述,我们不会使用字符串比较。如果用户开始输入,然后决定将其放回N / A并将其写成小写(&#34; n / a&#34;)该怎么办?好吧,我们会犯错,相信他确实填满了文本框,你最终会搜索用户&#34; n / a&#34;在你的数据库中,这不是一个好主意...
因此,让compare the String让我们的功能更加出色:
Private Function IsEmpty(Tb As Textbox) As Boolean
'Here we return true if tb.Text is empty or contains "N/A" (or "n/a")
Return Tb.Text = "" Or (String.Compare(Tb.Text, "N/A", True) = 0)
End Function
注意的
你可以在这里看到功能的优势。我写这篇文章是因为我不想改为String.Compare()
六次......每当你有两次相同的代码时,它应该是一个函数......
答案 1 :(得分:0)
如果您想给用户一个正确的错误消息,告诉他他错过了哪些,您必须将if语句分成几个部分。
首先检查所有文本框是否包含任何有效数据 如果没有,您可以直接跳过进一步的检查 如果一个文本框包含数据检查,并相应地设置错误。
If (txt_customername.Text = "" OrElse txt_customername.Text = "N/A") AndAlso
(txt_customercontact.Text = "" OrElse txt_customercontact.Text = "N/A") AndAlso
(txt_customeracc.Text = "" OrElse txt_customeracc.Text = "N/A") Then
'No Error exit sub
Exit Sub
End If
'This part is only reached if one textbox contains data
If (txt_customername.Text = "" OrElse txt_customername.Text = "N/A") Then
error1 += vbNewLine & "Please enter a correct Customer Name"
End If
If (txt_customercontact.Text = "" OrElse txt_customercontact.Text = "N/A") Then
error1 += vbNewLine & "Please enter a correct Customer Contact"
End If
If (txt_customeracc.Text = "" OrElse txt_customeracc.Text = "N/A") Then
error1 += vbNewLine & "Please enter a correct Customer Account Number"
End If
正如您所看到的,我还建议使用短路OrElse
和AndAlso
,这样可以提供更好的性能。
答案 2 :(得分:0)
您可以计算填充字段的数量。
Dim numberFilled As Integer = 0
If txt_customername.Text <> "" And txt_customername.Text <> "N/A" Then
numberFilled += 1
End If
If txt_customercontact.Text <> "" And txt_customercontact.Text <> "N/A" Then
numberFilled += 1
End If
If txt_customeracc.Text <> "" And txt_customeracc.Text <> "N/A" Then
numberFilled += 1
End If
If numberFilled = 1 Or numberFilled = 2 Then
error1 += vbNewLine & "Please enter a correct Customer Account Number"
End If
我个人会有一个函数IsValueEmpty来检查:
Function IsValueEmpty(ByVal value As String) As Boolean
If String.IsNullOrEmpty(value) Or value = "N/A" Then
Return True
End If
Return False
End Function
也可以修剪。
答案 3 :(得分:0)
您可以将相关的消息部分存储在每个文本框的Tag
属性中并使用Linq:
Dim customerTextBoxes = {txt_customeracc, txt_customername, txt_customercontact}
Dim messages = Aggregate customerTextBox In customerTextBoxes
Where customerTextBox.Text = "" OrElse customerTextBox.Text = "N/A"
Select $"Please enter a correct {customerTextBox.Tag}")
Into ToArray
然后只需检查它与原始长度的长度,如果它们不等于聚合显示的消息
If customerTextBoxes.Length <> messages.Length Then error1 = String.Join(Environment.NewLine, messages)