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