[VB.NET] ฟังค์ชั่นดักการกดคีย์ที่ต้องการใน TextBox Control ด้วยการใช้ Enum
http://www.g2gnet.com/webboard/images/vbnet/ValidateTextBox.pngเรื่องของการดักเช็คค่าการกดคีย์ใน TextBox เรียกได้ว่าเป็นคีย์เวิร์ดยอดฮิตที่ใช้ค้นหาใน Google รวมไปถึงคนที่เข้ามาอ่านในส่วนของบทความของแอดมินเพียบเลย ซึ่งแอดมินได้นำเสนอไปในรูปแบบของฟังค์ชั่น แต่แยกแต่ละแบบออกจากกัน เช่น ฟังค์ชั่นนี้เฉพาะการกดคีย์ตัวเลข หรือฟังค์ชั่นนั้นเฉพาะตัวอักษรเท่านั้น มาวันนี้แอดมินจะขอนำเสนอแบบเหมาหมด โดยรวบยอดเอามาไว้ในฟังค์ชั่นตัวเดียวกัน และอาศัยหลักการผสมผสาน VB6 กับ VB.NET เข้าด้วยกัน
Enum เป็นประเภทข้อมูลที่เป็นชุดของตัวเลขจำนวนเต็ม มันใช้กำหนดกลุ่มของค่าคงที่ ที่ทำให้มีความหมายและเข้าใจได้ง่ายขึ้นในการเขียนโปรแกรม
การประกาศตัวแปรแบบ Enum
Private Enum eTextType
Normal = 0
AlphaNumeric = 1
NumbersOnly = 2
Currency = 3
UCaseAlphabet = 4
End Enumการนำเอา Enum มาใช้กับบทความนี้ ก็เพื่อที่เราจะได้ไม่ต้องจดจำตัวเลขยังไงล่ะครับ เช่น eTextType.NumbersOnly เราก็รู้ความหมายเลยว่าเป็นการกดคีย์ตัวเลขเท่านั้น หากเราใช้ค่าคงที่ธรรมดา ก็คงต้องมาไล่เรียงว่า 0 หรือ 5 คืออะไร และสังเกตว่ามันจะแตกต่างไปจากการประกาศค่าคงที่ด้วยตัวแปรแบบเดี่ยวๆ เช่น Const A = 0 หากมีแบบนี้สัก 10 ตัว เราก็ต้องจำชื่อตัวแปรอีก นี่แหละคือวิธีคิดนำเอา Enum มาใช้แก้ปัญหา
โค้ดแบบเต็มในส่วนของฟังค์ชั่น ... อันดับแรกต้องให้เข้าใจด้วยว่า e.Handled มีค่าเริ่มต้น (Default) เป็นเท็จ (False) หากมีการรีเทิร์นค่ากลับเป็นจริง (True) นั่นแสดงว่ากดคีย์นั้นๆใน TextBox ไม่ได้ (ค่า True หากแปลตามคู่มือใน MSDN ก็คือ CPU ไม่สนใจการกดคีย์)
' / ----------------------------------------------------------------
' / การคืนค่ากลับของฟังค์ชั่นนี้จะเป็นแบบ Boolean คือ True/False เพื่อระบุค่าให้กับ e.Handled
' / e.Handled = True หมายความว่า CPU ไม่สนใจการกดคีย์ ก็คือไม่รับค่าที่กดนั่นเอง
Public Function ValidKey(sender As System.Object, KeyCh As Char, ByVal Col As String) As Boolean
'/ หากเราต้องการตรวจสอบค่าที่มีอยู่ทั้งหมด
Dim tb As TextBox = sender
Select Case Col
'/ การใช้ Enum
'/ รับค่าตัวอักษรและตัวเลขเท่านั้น
Case eTextType.AlphaNumeric
ValidKey = Not (IsNumeric(KeyCh) Or (KeyCh Like "" Or KeyCh Like "") Or (KeyCh = Chr(8)))
'/ รับค่าแบบตัวเลขเท่านั้น
Case eTextType.NumbersOnly
'/ Chr(Keys.Back) คือการกด Backspace
ValidKey = Not (IsNumeric(KeyCh) Or (KeyCh = Chr(Keys.Back)))
'/ รับค่าแบบเลขทศนิยม สามารถมีจุดทศนิยมได้เพียงตัวเดียว
Case eTextType.Currency
ValidKey = Not (IsNumeric(KeyCh) Or (KeyCh = "." And Not CBool(InStr(tb.Text, "."))) Or (KeyCh = Chr(8)))
'/ รับค่าแบบตัวอักษรตัวใหญ่เท่านั้น
'/ Chr(8) คือ การกด Backspace จะใช้ได้กับภาษาโปรแกรมอื่นๆ เพราะอาศัยค่า ASCII Code
Case eTextType.UCaseAlphabet
ValidKey = Not (KeyCh Like "" Or (KeyCh = Chr(8)))
'/ อย่างอื่นให้คืนค่ากลับเป็นเท็จ
Case Else : ValidKey = False
End Select
End Functionเหตุผลที่แอดมินใช้ Select Case แทนที่จะเป็น IF-Else ก็เพราะว่าดูจากเงื่อนไขที่เป็นค่าคงที่ หรือช่วงของค่า ทำให้อ่านโค้ดได้ง่าย เมื่ออ่านได้ง่าย โอกาสเกิดความผิดพลาด (Bug) ก็จะมีน้อยลงไปนั่นเอง
วิธีการนำไปใช้
' / ----------------------------------------------------------------
Private Sub TextBox1_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress
'/ การเรียกใช้ก็ส่งชื่อ Control, ค่าคีย์ที่กด และรูปแบบที่ต้องการใน Enum
e.Handled = ValidKey(TextBox1, e.KeyChar, eTextType.Normal)
End Sub
Private Sub TextBox2_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox2.KeyPress
e.Handled = ValidKey(TextBox2, e.KeyChar, eTextType.AlphaNumeric)
End Sub
Private Sub TextBox3_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox3.KeyPress
e.Handled = ValidKey(TextBox3, e.KeyChar, eTextType.NumbersOnly)
End Sub
Private Sub TextBox4_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox4.KeyPress
e.Handled = ValidKey(TextBox4, e.KeyChar, eTextType.Currency)
End Sub
Private Sub TextBox5_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox5.KeyPress
e.Handled = ValidKey(TextBox4, e.KeyChar, eTextType.UCaseAlphabet)
End Sub ขอบคุณครับ
หน้า:
[1]