if语句的多个条件

时间:2016-12-07 10:13:28

标签: vb.net logical-operators

我有一个包含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框中输入信息,则会出现警告但当前警告消息正在显示,无论信息是或是没有进入任何一个方框。谁能告诉我我做错了什么?

4 个答案:

答案 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

正如您所看到的,我还建议使用短路OrElseAndAlso,这样可以提供更好的性能。

答案 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)