Vb.net if语句的多个条件

Vb.net if语句的多个条件,vb.net,logical-operators,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_customerconta

我有一个带有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.Text“”或txt_customername.Text“不适用”,或
txt_customercontact.Text“”或txt_customercontact.Text“不适用”,以及
txt_customeracc.Text=“”或txt_customeracc.Text=“不适用”
然后error1+=vbNewLine&“请输入正确的客户帐号”

因此,从上面的代码中,我希望如果用户在txt_customername或txt_customercontact文本框中输入信息,而不是在txt_customercontact文本框中输入信息,则会出现警告,但当前会显示警告消息,无论信息是否输入任何框中。有人能告诉我我做错了什么吗?

如果你想给用户一条正确的错误消息,告诉他没有填写什么,你必须将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

正如您所看到的,我还建议使用短路
或LSE
和also
,这会提供一点小的性能。

如果您想给用户一个正确的错误消息,告诉他他没有填写的内容,您必须将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
,这样可以提供一点小的性能。

您可以计算填充字段的数量

   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

也可以修剪。

您可以计算填充字段的数量

   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

也可以修剪。

什么是运算符优先级?

你这里的主要问题是,你有一个问题。那是什么

这和计算时的问题完全一样,先是乘法,然后是加法。在VB.NET中,
操作符位于
之前,因此您在代码中编写的内容将按以下方式进行评估:

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
更好,调用函数

这里的另一个问题是可读性,这段代码可能有错误,因为它很难阅读,很难调试

我们可以做的是构建一个函数来检查文本框是否为空:

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并将其写为小写(“N/a”)?好吧,我们会犯一个错误,相信他确实填写了文本框,你最终会在数据库中搜索用户“n/a”,这不是一个好主意

让我们把我们的功能做得更好:

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()
六次。。。当您有两次相同的代码时,它应该是一个函数…

什么是运算符优先级?

你这里的主要问题是,你有一个问题。那是什么

这和计算时的问题完全一样,先是乘法,然后是加法。在VB.NET中,
操作符位于
之前,因此您在代码中编写的内容将按以下方式进行评估:

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
更好,调用函数

这里的另一个问题是可读性,这段代码可能有错误,因为它很难阅读,很难调试

我们可以做的是构建一个函数来检查文本框是否为空:

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并将其写为小写(“N/a”)?好吧,我们会犯一个错误,相信他确实填写了文本框,你最终会在数据库中搜索用户“n/a”,这不是一个好主意

让我们把我们的功能做得更好:

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()
六次。。。当您有两次相同的代码时,它应该是一个函数…

您可以将相关的消息部分存储在每个文本框的
标记中,并使用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)
如果customerTextBox.Length messages.Length,则error1=String.Join(Environment.NewLine,messages)

您可以将相关消息部分存储在每个文本框的
标记中
属性中,并使用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)
如果customerTextBox.Length messages.Length,则error1=String.Join(Environment.NewLine,messages)

我一直在努力解决这个问题,但似乎如果我从查询中删除“N/A”元素并修改表单,使框加载为空,那么它就可以完美地工作,感谢您的帮助,我无法相信没有人在进行字符串比较。如果用户输入
n/a
将通过该检查。比较在这里是可行的,托洛尔还是图恩