thongkorn โพสต์ 2020-3-14 13:58:39

[VB.NET] การกดคีย์ Enter เพื่อเลื่อนตำแหน่งโฟกัสของ Control

ใน Visual Basic ทุกรุ่น มันไม่มีคำสั่งโดยตรง เวลาที่ผู้ใช้กด Enter แล้วให้โฟกัสไปยัง Control ตัวถัดไป เพราะ VB มันใช้การกดปุ่ม Tab แทน แต่คนทั่วๆไปจะถนัดการกด Enter มากกว่า ดังนั้นเราต้องเขียนโค้ดขึ้นมาใหม่เอง สำหรับ TextBox มันจะอยู่ที่เหตุการณ์ KeyPress ส่วน Control ตัวอื่นๆจะใช้เหตุการณ์ KeyDown แล้วส่งรหัสการกด Tab ไปแทน ... สรุปผู้ใช้งานนึกว่าตัวเองกด Enter แต่แท้ที่จริงเราส่งคีย์ Tab ไปแทนนั่นเอง

e.Handled = True คือ การปิดเสียงลำโพงครับ
ตัวอย่าง ... สำหรับ TextBox Control จะใช้เหตุการณ์ KeyPress
    Private Sub TextBox1_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress
      If Asc(e.KeyChar) = 13 Then
            e.Handled = True
            SendKeys.Send("{TAB}")
      End If
    End Sub
ตัวอย่าง ... สำหรับ ComboBox Control จะใช้เหตุการณ์ KeyDown
    Private Sub ComboBox1_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles ComboBox1.KeyDown
      If e.KeyCode = Keys.Enter Then
            e.Handled = True
            SendKeys.Send("{TAB}")
      End If
    End Sub
ตัวอย่าง ... สำหรับ TextBox Control โดยแก้ไขให้ใช้โปรแกรมย่อยแทน
    Private Sub TextBox1_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress
      'If Asc(e.KeyChar) = 13 Then
      'e.Handled = True
      'SendKeys.Send("{TAB}")
      'End If
      '/ เรียกใช้ผ่านโปรแกรมย่อยแทน
      Call KeyPressed(TextBox1, e)
    End Sub

    ' / งานซ้ำๆก็ควรเขียนเป็นโปรแกรมย่อย (Sub Program)
    Public Sub KeyPressed(o As Object, e As KeyPressEventArgs)
      If Asc(e.KeyChar) = 13 Then
            e.Handled = True
            SendKeys.Send("{TAB}")
      End If
    End Sub
ตัวอย่าง ... สำหรับ ComboBox Control โดยแก้ไขให้ใช้โปรแกรมย่อยแทน
    Private Sub ComboBox1_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles ComboBox1.KeyDown
      'If e.KeyCode = Keys.Enter Then
      'e.Handled = True
      'SendKeys.Send("{TAB}")
      'End If
      '/ เรียกใช้ผ่านโปรแกรมย่อยแทน
      Call KeyDowned(ComboBox1, e)
    End Sub

    Public Sub KeyDowned(o As Object, e As KeyEventArgs)
      If e.KeyCode = Keys.Enter Then
            e.Handled = True
            SendKeys.Send("{TAB}")
      End If
    End Sub

jaricha5 โพสต์ 2020-4-20 15:56:37

ขอบคุณครับ

puklit โพสต์ 2020-4-21 09:24:19

ผมมีอีก 1 ตัวอย่างคือการเรียกใช้ Function SelectNextControl
เขียนโค้ดได้ดังนี้ครับ (ตัวอย่างผมมี 10 TextBox ใช้ Event Keydown)

Private Sub TextBox_KeyDown(sender As Object, e As KeyEventArgs) Handles TextBox9.KeyDown, TextBox8.KeyDown, TextBox7.KeyDown, TextBox6.KeyDown, TextBox5.KeyDown, TextBox4.KeyDown, TextBox3.KeyDown, TextBox2.KeyDown, TextBox10.KeyDown, TextBox1.KeyDown

      If e.KeyCode = Keys.Enter Then
            Me.SelectNextControl(sender, True, True, True, True)
      End If

    End Sub

หน้า: [1]
ดูในรูปแบบกติ: [VB.NET] การกดคีย์ Enter เพื่อเลื่อนตำแหน่งโฟกัสของ Control