2015-03-08 84 views
1

Frm1調用公共函數中包含的textbox驗證碼:如何從另一種形式

Public Function AlphabeticalOnly(ByVal Str As String) As Boolean 
    Dim pattern As String = "^[a-zA-Z\s]+$" 
    Dim reg As New Regex(pattern) 
    If reg.IsMatch(Str) = False Then 
     MsgBox(Str & " is invalid! Please enter alphabetical characters only!", MsgBoxStyle.Critical, "Error") 
    End If 
    Return reg.IsMatch(Str) 
End Function 

因爲在你住驗證的量,我不想再次重複所有的代碼其他形式。

Private Sub btnDone_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDone.Click 
If AlphabeticalOnly(txtName.Text) = False Then 
     Exit Sub 
End If 
... 
End Sub 

我想上面的代碼中的另一種形式,但錯誤列表顯示AlphabeticalOnly未聲明。

有什麼我需要添加到我的代碼?

回答

3

首先,不要把功能放在的形式。如果它是所有表單共享的通用代碼,請將其放入其自己的類文件中。

其次,這個通用代碼不應該用消息框提示用戶。這個函數應該只是執行邏輯而已。 (這也使得該函數更容易進行單元測試。)然後允許消費代碼(在這種情況下是表單)與用戶進行交互。 (特別是由於當前實現檢查兩次匹配,這是沒有必要的。)

由於此函數不依賴於對象狀態,因此您可以將它設置爲Shared。事情是這樣的:

Public Class CommonFunctions 
    Public Shared Function IsAlphabeticalOnly(ByVal Str As String) As Boolean 
     Dim pattern As String = "^[a-zA-Z\s]+$" 
     Dim reg As New Regex(pattern) 
     Return reg.IsMatch(Str) 
    End Function 
End Class 

然後在你的表格,你可以調用該函數:

If CommonFunctions.IsAlphabeticalOnly(txtName.Text) = False Then 
    MsgBox(Str & " is invalid! Please enter alphabetical characters only!", MsgBoxStyle.Critical, "Error") 
End If 
+0

我奉勸不要過度使用靜態函數,因爲他們使單元測試更加困難,成爲東西不能僞裝出來。否則你的答案是現貨,我不知道誰投了票。 – Tim 2015-03-09 04:39:24

+0

大衛你好!你的方法就像一個魅力!但是,我發現在每個文本框中使用KeyPress事件對我來說是更好的方法!不管怎麼說,還是要謝謝你! – Caesium95 2015-03-09 18:18:07

+0

@ Caesium95:很高興能幫到你! keypress事件同樣好,這裏的要點不是使用哪個事件,而是在哪裏組織通用代碼。這種輔助方法絕對屬於UI級輔助類而不是表單。它是否應該被「共享」,或者該共同代碼的結構應該是什麼,這是值得商榷的。理想情況下,隨着更多代碼的添加,這將轉向更加面向對象的設計。但是,對於這種幫助者方法,目標是實現簡單地將代碼從表單中移出。 – David 2015-03-09 18:20:52