[VB.NET] การป้อนค่าลง TextBox เพื่อให้รับค่าเฉพาะตัวเลขเท่านั้น
ทฤษฎีในการใช้คำสั่งเงื่อนไข (Condition) ... ซึ่งจะมีอยู่ 2 แบบดังนี้- If Then Else จะเหมาะสมกับในกรณีที่มีเงื่อนไขเป็น จริง/เท็จ หรือ True/False
- Select Case จะใช้ในกรณีที่มี เงื่อนไขเป็นตัวเลือก เช่น "1", "10", "A" หรือ 1, 3, 5 หรือ ค่าตัวเลือกเป็นช่วง เช่น 1 To 100
*** โจทย์ข้อนี้ทำไมแอดมินถึงได้เลือก Select Case แทนการใช้ If ก็ลองคิดตามดูเอาน่ะครับ ***
แนวคิดแบบที่ 1 :
ตัวอย่างนี้แอดมินไม่ได้เปลี่ยนแนวคิดจาก VB6 เลย ... ดังนั้นผมก็จะเล่นตามแนวทางเดิม โดยอาศัย ASCII Code แต่ทว่าเราไม่สามารถนำ KeyAscii ใน VB6 มาใช้งานใน Dot Net ได้ ดังนั้นจึงต้องอาศัย e.KeyChar (มันจะระบุคีย์นั้นๆ ออกมาเลย เช่น "S") เข้ามาช่วย เราต้องแปลงให้เป็นรหัส ASCII Code ด้วยคำสั่ง Asc อีกที
ส่วน e.Handled ในความหมายของแอดมิน คือ การบ่งบอกสถานะการล็อคเหตุการณ์ Keypress ซึ่ง ...
หากมันเป็น False แสดงว่าเกิดการ Return ค่าคีย์ที่กดได้ (ก็ค่า ASCII นั่นแหละ)
หากมันเป็น True แสดงว่าเกิดการ Return ค่าคีย์ที่กดเป็น 0 (ไม่มีการกดคีย์)
(หากแปลตามคู่มือของ MSDN หาก Handled = True คือการที่ CPU ไม่สนใจเหตุการณ์ที่เกิดขึ้น คือไม่รับรู้การกดคีย์นั่นแหละครับ) Private Sub TextBox1_KeyPress(ByVal sender As Object, _
ByVal e As System.Windows.Forms.KeyPressEventArgs _
) _
Handles TextBox1.KeyPress
Dim KeyAscii As Short = Asc(e.KeyChar)
Select Case KeyAscii
Case 48 To 57
e.Handled = False
Case 8, 13 ' Backspace = 8, Enter = 13
e.Handled = False
Case Else
e.Handled = True
End Select
End Sub
เขียนโค้ดแบบนี้หากมี TextBox จำนวนมากๆจะทำยังไงดีล่ะ ... ก็เปลี่ยนเป็นฟังค์ชั่น (Function) แทนซิครับพี่น้อง
Private Sub TextBox1_KeyPress(ByVal sender As Object, _
ByVal e As System.Windows.Forms.KeyPressEventArgs _
) _
Handles TextBox1.KeyPress
Dim KeyAscii As Short = Asc(e.KeyChar)
' ตรวจสอบการ Return ค่ากลับว่า True หรือ False
e.Handled = CheckDigitOnly(KeyAscii)
End Sub
Function CheckDigitOnly(ByVal index As Integer) As Boolean
Select Case index
Case 48 To 57 ' เลข 0 - 9
CheckDigitOnly = False
Case 8, 13 ' Backspace = 8, Enter = 13
CheckDigitOnly = False
Case Else
CheckDigitOnly = True
End Select
End Function
แนวคิดแบบที่ 2 :
แบบที่ 1 รู้สึกว่ามันจะบ้านๆเกินไป ต้องลดรูปแบบลงมา ... โดยใช้ฟังค์ชั่น (หรือ คำสั่ง) Asc(ตัวอักขระ) เพื่อระบุตัวอักขระนั้นๆโดยตรง เช่น Asc("0") ก็จะมีค่า ASCII Code เท่ากับ 48
Private Sub TextBox1_KeyPress(ByVal sender As Object, _
ByVal e As System.Windows.Forms.KeyPressEventArgs _
) _
Handles TextBox1.KeyPress
Select Case Asc(e.KeyChar)
Case 48 To 57
e.Handled = False
Case 8, 13, 46 ' Backspace = 8, Enter = 13
e.Handled = False
Case Else
e.Handled = True
End Select
End Sub
แนวคิดแบบที่ 3 :
จะใช้ฟังค์ชั่น (หรือคำสั่ง) Chr(รหัสแอสกี้) เข้ามาช่วย นั่นคือ Chr(48) ก็จะมีค่าเท่ากับตัวอักขระ "0"
Private Sub TextBox1_KeyPress(ByVal sender As Object, _
ByVal e As System.Windows.Forms.KeyPressEventArgs _
) _
Handles TextBox1.KeyPress
Select Case e.KeyChar
Case Chr(48) To Chr(57)
e.Handled = False
Case Chr(8), Chr(13)
e.Handled = False
Case Else
e.Handled = True
End Select
End Sub
แนวคิดแบบที่ 4 :
คราวนี้มาใช้ตัวอักขระโดยตรงไปเลย คือ "0", "1", ... "9" (ต้องอยู่ภายในเครื่องหมาย Double Quote หรือ "")
Private Sub TextBox1_KeyPress(ByVal sender As Object, _
ByVal e As System.Windows.Forms.KeyPressEventArgs _
) _
Handles TextBox1.KeyPress
Select Case e.KeyChar
Case "0" To "9"
e.Handled = False
Case Chr(8), Chr(13)
e.Handled = False
Case Else
e.Handled = True
End Select
End SubConclusion: สิ่งที่แอดมินนำมาเสนอนี้ ก็ล้วนแล้วแต่มาจากพื้นฐานทั้งนั้นแหละครับ
ขอบคุณครับ
หน้า:
[1]