thongkorn โพสต์ 2017-11-27 09:53:02

[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

g2gsoftuser โพสต์ 2022-10-25 17:29:26

ขอบคุณครับ
หน้า: [1]
ดูในรูปแบบกติ: [VB.NET] ฟังค์ชั่นดักการกดคีย์ที่ต้องการใน TextBox Control ด้วยการใช้ Enum