2016-12-07 148 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)