ลงชื่อเข้าใช้
กระดานข่าว VB > ทิปเทคนิคการเขียนโปรแกรม
ส่ง|
ดู8006|โพสต์1|บุ๊คมาร์ก
ทฤษฎีในการใช้คำสั่งเงื่อนไข (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: สิ่งที่แอดมินนำมาเสนอนี้ ก็ล้วนแล้วแต่มาจากพื้นฐานทั้งนั้นแหละครับ

ขอบคุณครับ

G2GNet.com

Powered by Discuz! X3.4

โฮมเพจ|รูปแบบทั่วไป|รูปแบบโมเดิร์น|รูปแบบคอมพิวเตอร์