2016-12-07 144 views
0

我有3文本框,txt_customeracc,txt_customername一种形式,txt_customercontact多个标准if语句

这些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盒警告应然后出现,但是不管是否在任何方框中输入信息,当前都显示警告信息。谁能告诉我我做错了什么?

+1

我这个苦苦挣扎,但似乎如果我从查询中删除“N/A”元素和修改表单,因此该盒装载空白它完美,谢谢你们的帮助Wingedpanther – Boneyt

+1

出的所有的答案只要我不能相信没有人在做字符串比较。如果用户输入'n/a',将会通过该检查。比较会在这里工作,ToLower或ToUpper,只是一个想法... – Codexer

+1

@Zaggler我编辑了我的回答下面你的评论 –

回答

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 

因为这不是你真正想要的东西,让我们构建了一起:

  • 如果customernameORcustomercontact被填满

  • 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并将其写入小写字母(“n/a”)会怎么样?那么,我们会犯一个错误,认为他确实填满了文本框,并且最终会在数据库中搜索用户“n/a”,这不是一个好主意......

因此,让我们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() ...每当你有两次相同的代码,它应该是一个函数...

+0

感谢Martin,对于一个简单的头脑(我)来说,这是一个非常简单的解释,正是我所需要的 – Boneyt

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这给littttttttle性能。

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 

也可以修剪。

+0

'IsValueEmpty'正文可以是'Return String.IsNullOrEmpty(value)OrElse value =“N/A”' – Sehnsucht

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)