前文貼了身分證字號基本的驗證部分,這幾天又加上了「字串產生器」功能並且重做了介面。非專業製作的效果及功能未盡完美是必然的,不過還是要分享一下過程和經驗。
身分證字號驗證程序(一)用函式做出了基本的驗證部分,這幾天又加上了「字串產生器」功能並且重做了介面。
非專業製作的效果及功能未盡完美是必然的,不過還是要分享一下過程和經驗。
新增的部分:
- 輸入防呆不是輸入後再驗證,改採用前置驗證方式從 Keypress 攔截 Key In 的字元,若正確才允許輸入。
- 輸入時先做字元判斷,例如第一字元應為 A-z,第二字元應為 1-2,之後8個字元都應是數字。
- 輸入未滿十個字元時只做格式檢查,完整輸入後再驗算檢查碼。
- 輸入時在下方「產生器」欄內同步產生縣市、性別及前置數字,並以當下內容建立條件,按下 Button 可立即產生正確字組。
- 點選產生的數組會自動送到驗證區進行檢查碼驗證。(其實應該都是正確的啦,否則就是程式有 Bug 了)
- 加上了點部落格的連結,和寄送 Mail 的連結。
- 改善了介面外觀。
程式碼部分:
-
輸入防呆不是輸入後再驗證,採用前置驗證方式從 Keypress 攔截 Key In 的字元,若正確才允許輸入。
這個方法是我寫程式以來用過的最簡便手法,一行搞定。
e.KeyChar = IIf(InStr("0123456789" & vbBack, e.KeyChar), e.KeyChar, "")
-
輸入時先做字元判斷,例如第一字元應為 A-z,第二字元應為 1-2,之後8個字元都應是數字。
'---輸入防呆(根據輸入位置動態改變過濾字元集)--- Private Sub T1_輸入字元限制(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) _ Handles txt_輸入號碼.KeyPress Dim tBox = DirectCast(sender, TextBox) e.KeyChar = UCase(e.KeyChar) Select Case tBox.SelectionStart Case 0 : tBox.Tag = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" Case 1 : tBox.Tag = "12" Case Else : tBox.Tag = "0123456789" End Select e.KeyChar = IIf(InStr(tBox.Tag & vbBack, e.KeyChar), e.KeyChar, "") End Sub
-
只允許輸入數字的做法(若要過濾其他字元,改那個 “0123456789”就成了。)
'---輸入防呆(限制輸入為數字)--- Private Sub T2_輸入字元限制(sender As System.Object, e As System.Windows.Forms.KeyPressEventArgs) _ Handles txt_前置篩選數字.KeyPress, cmb_產生筆數.KeyPress e.KeyChar = IIf(InStr("0123456789" & vbBack, e.KeyChar), e.KeyChar, "") End Sub
-
輸入未滿十個字元時只做格式檢查,完整輸入後再做檢查碼驗算。
'----輸入防呆(控制項的互動邏輯)--- Private Sub 輸入號碼改變(sender As System.Object, e As System.EventArgs) _ Handles txt_輸入號碼.TextChanged Dim str = DirectCast(sender, TextBox).Text lbl_戶籍地.Text = "" lbl_性別.Text = "" If Len(str) < 10 Then lbl_完整驗證.Text = "輸入的號碼不完全(或格式錯誤)。" lbl_完整驗證.ForeColor = Color.Blue Else 身分證元件.身分證號碼 = str lbl_完整驗證.Text = "這個身分證字號是" & IIf(身分證元件.驗證結果, "正確的。", "錯誤的!") & "" lbl_完整驗證.ForeColor = IIf(身分證元件.驗證結果, Color.Green, Color.Red) End If If str <> "" Then Try If Len(str) >= 1 Then lbl_戶籍地.Text = 身分證元件.所有縣市名稱(Asc(str.First) - 65) cmb_縣市.Text = lbl_戶籍地.Text End If If Len(str) >= 2 Then Dim c As Integer = InStr("12", Mid(str, 2, 1)) If c Then lbl_性別.Text = Mid("男女", c, 1) cmb_性別.Text = lbl_性別.Text End If If 同步更新篩選欄 Then txt_前置篩選數字.Text = Mid(str, 3, 7) End If End If Catch ex As Exception End Try End If End Sub
-
數組產生後,點選後自動送到驗證區進行檢查碼驗證。
'---當列表中的項目被選定--- Private Sub 輸出到列表() Handles lst_輸出列表.SelectedIndexChanged 同步更新篩選欄 = False txt_輸入號碼.Text = lst_輸出列表.Text End Sub
-
加上了點部落格的連結,和寄送 Mail 的連結(下方的網址連結用左右鍵分別,上方小圖直接連結到目的)。
Private Sub LinkLabel1_LinkClicked(sender As System.Object, e As System.Windows.Forms.LinkLabelLinkClickedEventArgs) Handles LinkLabel1.LinkClicked Select Case e.Button Case MouseButtons.Left : 到網址() Case MouseButtons.Right : 寄信件() End Select End Sub Private Sub 到網址() Handles pic_到網址.Click Process.Start("http://www.dotblogs.com.tw/ku3") End Sub Private Sub 寄信件() Handles pic_寄信件.Click Process.Start("mailto://ku3@teamsoftex.com?Subject=網路來函(About.." & 程式名稱 & ")") End Sub
Class 的程式碼及表單程式碼就不貼了,有興趣的朋友可直下載專案原始檔參考。
專案原始碼下載:[身分證驗證_專案原始檔.rar]
Demo 程下載:[身分證驗證_demo.rar]