ชุมชนคนรักภาษาเบสิค - Visual Basic Community

 ลืมรหัสผ่าน
 ลงทะเบียน
ค้นหา
ดู: 8011|ตอบกลับ: 1

[VB.NET] การป้อนค่าลง TextBox เพื่อให้รับค่าเฉพาะตัวเลขเท่านั้น

[คัดลอกลิงก์]

309

กระทู้

500

โพสต์

6030

เครดิต

ผู้ดูแลระบบ

ทองก้อน ทับทิมกรอบ

Rank: 9Rank: 9Rank: 9

เครดิต
6030

ทฤษฎีในการใช้คำสั่งเงื่อนไข (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 ไม่สนใจเหตุการณ์ที่เกิดขึ้น คือไม่รับรู้การกดคีย์นั่นแหละครับ)
  1.      Private Sub TextBox1_KeyPress(ByVal sender As Object, _
  2.                                   ByVal e As System.Windows.Forms.KeyPressEventArgs _
  3.                                   ) _
  4.                                   Handles TextBox1.KeyPress

  5.         Dim KeyAscii As Short = Asc(e.KeyChar)
  6.         Select Case KeyAscii
  7.             Case 48 To 57
  8.                 e.Handled = False
  9.             Case 8, 13 ' Backspace = 8, Enter = 13
  10.                 e.Handled = False
  11.             Case Else
  12.                 e.Handled = True
  13.         End Select
  14.     End Sub
คัดลอกไปที่คลิปบอร์ด

เขียนโค้ดแบบนี้หากมี TextBox จำนวนมากๆจะทำยังไงดีล่ะ ... ก็เปลี่ยนเป็นฟังค์ชั่น (Function) แทนซิครับพี่น้อง
  1.     Private Sub TextBox1_KeyPress(ByVal sender As Object, _
  2.                                   ByVal e As System.Windows.Forms.KeyPressEventArgs _
  3.                                   ) _
  4.                                   Handles TextBox1.KeyPress

  5.         Dim KeyAscii As Short = Asc(e.KeyChar)
  6.         ' ตรวจสอบการ Return ค่ากลับว่า True หรือ False
  7.         e.Handled = CheckDigitOnly(KeyAscii)
  8.     End Sub

  9.     Function CheckDigitOnly(ByVal index As Integer) As Boolean
  10.         Select Case index
  11.             Case 48 To 57 ' เลข 0 - 9
  12.                 CheckDigitOnly = False
  13.             Case 8, 13 ' Backspace = 8, Enter = 13
  14.                 CheckDigitOnly = False
  15.             Case Else
  16.                 CheckDigitOnly = True
  17.         End Select
  18.     End Function
คัดลอกไปที่คลิปบอร์ด

แนวคิดแบบที่ 2 :
แบบที่ 1 รู้สึกว่ามันจะบ้านๆเกินไป ต้องลดรูปแบบลงมา ... โดยใช้ฟังค์ชั่น (หรือ คำสั่ง) Asc(ตัวอักขระ) เพื่อระบุตัวอักขระนั้นๆโดยตรง เช่น Asc("0") ก็จะมีค่า ASCII Code เท่ากับ 48
  1.     Private Sub TextBox1_KeyPress(ByVal sender As Object, _
  2.                                   ByVal e As System.Windows.Forms.KeyPressEventArgs _
  3.                                   ) _
  4.                                   Handles TextBox1.KeyPress
  5.         Select Case Asc(e.KeyChar)
  6.             Case 48 To 57
  7.                 e.Handled = False
  8.             Case 8, 13, 46 ' Backspace = 8, Enter = 13
  9.                 e.Handled = False
  10.             Case Else
  11.                 e.Handled = True
  12.         End Select
  13.     End Sub
คัดลอกไปที่คลิปบอร์ด

แนวคิดแบบที่ 3 :
จะใช้ฟังค์ชั่น (หรือคำสั่ง) Chr(รหัสแอสกี้) เข้ามาช่วย นั่นคือ Chr(48) ก็จะมีค่าเท่ากับตัวอักขระ "0"
  1.     Private Sub TextBox1_KeyPress(ByVal sender As Object, _
  2.                                   ByVal e As System.Windows.Forms.KeyPressEventArgs _
  3.                                   ) _
  4.                                   Handles TextBox1.KeyPress
  5.         Select Case e.KeyChar
  6.             Case Chr(48) To Chr(57)
  7.                 e.Handled = False
  8.             Case Chr(8), Chr(13)
  9.                 e.Handled = False
  10.             Case Else
  11.                 e.Handled = True
  12.         End Select
  13.     End Sub
คัดลอกไปที่คลิปบอร์ด

แนวคิดแบบที่ 4 :
คราวนี้มาใช้ตัวอักขระโดยตรงไปเลย คือ "0", "1", ... "9" (ต้องอยู่ภายในเครื่องหมาย Double Quote หรือ "")
  1.     Private Sub TextBox1_KeyPress(ByVal sender As Object, _
  2.                                   ByVal e As System.Windows.Forms.KeyPressEventArgs _
  3.                                   ) _
  4.                                   Handles TextBox1.KeyPress
  5.         Select Case e.KeyChar
  6.             Case "0" To "9"
  7.                 e.Handled = False
  8.             Case Chr(8), Chr(13)
  9.                 e.Handled = False
  10.             Case Else
  11.                 e.Handled = True
  12.         End Select
  13.     End Sub
คัดลอกไปที่คลิปบอร์ด
Conclusion: สิ่งที่แอดมินนำมาเสนอนี้ ก็ล้วนแล้วแต่มาจากพื้นฐานทั้งนั้นแหละครับ
สิ่งที่ดีกว่าการให้ คือการให้แบบไม่มีที่สิ้นสุด

0

กระทู้

6

โพสต์

16

เครดิต

Newbie

Rank: 1

เครดิต
16
โพสต์ 2020-8-6 09:17:49 | ดูโพสต์ทั้งหมด


ขอบคุณครับ
ขออภัย! คุณไม่ได้รับสิทธิ์ในการดำเนินการในส่วนนี้ กรุณาเลือกอย่างใดอย่างหนึ่ง ลงชื่อเข้าใช้ | ลงทะเบียน

รายละเอียดเครดิต

ข้อความล้วน|อุปกรณ์พกพา|ประวัติการแบน|G2GNet.com  

GMT+7, 2024-4-19 20:55 , Processed in 0.383353 second(s), 4 queries , File On.

Powered by Discuz! X3.4, Rev.62

Copyright © 2001-2020 Tencent Cloud.

ตอบกระทู้ ขึ้นไปด้านบน ไปที่หน้ารายการกระทู้