programing

VB.NET에서 Enter 키를 누르는 중

padding 2023. 5. 23. 21:36
반응형

VB.NET에서 Enter 키를 누르는 중

VB.NET 2008의 .NET 3.5 프레임워크를 사용하고 있습니다.

제 양식에 텍스트 상자가 몇 개 있습니다.사용자가 내 텍스트 상자 중 하나에서 ENTER를 누를 때 탭과 같은 동작을 원합니다.다음 코드를 사용했습니다.

Private Sub txtDiscount_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtDiscount.KeyPress
    If e.KeyChar = Microsoft.VisualBasic.ChrW(Keys.Return) Then
        SendKeys.Send("{TAB}")
        e.Handled = True
    End If
End Sub

하지만 저한테는 효과가 없어요.

해결책은 무엇일까?

키다운 이벤트:

 If e.KeyCode = Keys.Enter Then
       Messagebox.Show("Enter key pressed")
 end if

KeyPreview 속성 양식이 true로 설정되어 있는지 확인합니다.

Private Sub Form1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles Me.KeyPress
    If e.KeyChar = Microsoft.VisualBasic.ChrW(Keys.Return) Then
        SendKeys.Send("{TAB}")
        e.Handled = True
    End If

End Sub

KeyPreview Property를 True로 설정할 필요가 없습니다.다음 기능만 추가하면 됩니다.

Protected Overrides Function ProcessCmdKey(ByRef msg As System.Windows.Forms.Message, _
                                           ByVal keyData As System.Windows.Forms.Keys) _
                                           As Boolean

    If msg.WParam.ToInt32() = CInt(Keys.Enter) Then
        SendKeys.Send("{Tab}")
        Return True
    End If
    Return MyBase.ProcessCmdKey(msg, keyData)
End Function

이제 텍스트 상자에서 Enter 키를 누르면 컨트롤이 다음 컨트롤로 이동합니다.

VB 2010.NET 4.0을 사용하고 있으며 다음을 사용합니다.

Private Sub tbSecurity_KeyPress(sender As System.Object, e As System.EventArgs) Handles tbSecurity.KeyPress
    Dim tmp As System.Windows.Forms.KeyPressEventArgs = e
    If tmp.KeyChar = ChrW(Keys.Enter) Then
        MessageBox.Show("Enter key")
    Else
        MessageBox.Show(tmp.KeyChar)
    End If

End Sub

매력적으로 작동합니다!

미리보기 키다운 이벤트를 사용할 수 있습니다.

Private Sub txtPassword_PreviewKeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PreviewKeyDownEventArgs) Handles txtPassword.PreviewKeyDown
    If e.KeyCode = Keys.Enter Then
        Call btnLogin_Click(sender, e)
    End If
End Sub

VB.NET 2010에서 테스트됨

다음을 시도할 수도 있습니다.

If e.KeyChar = ChrW(Keys.Enter) Then
     'Do Necessary code here
End If

답변이 완료되었지만 양식의 Accept 버튼에 유효성 검사를 걸기만 하면 엔터 키의 모든 '리매핑'을 피할 수 있을 것 같습니다.즉, 3개의 텍스트 상자(txtA, txtB, txtC)와 '확인' 버튼이 AcceptButton(및 TabOrder가 올바르게 설정됨)으로 설정됩니다.따라서 txtA에서 Enter 키를 누른 경우 데이터가 유효하지 않으면 포커스가 txtA에 유지되지만, 유효한 경우 다른 txt가 입력이 필요하다고 가정하면 유효성 검사는 유효한 입력이 필요한 다음 txt로 이동하여 Tab 동작을 시뮬레이션합니다.모든 txt가 유효한 입력을 받으면 Enter 키를 누르면 성공적인 유효성 검사가 실행되고 양식이 닫힙니다(또는 어떤 식으로든...). 이해가 됩니까?

Private Sub SomeTextBox_KeyPress(sender As Object, e As KeyPressEventArgs) Handles SomeTextBox.KeyPress

    If Asc(e.KeyChar) = 13 Then
         MessageBox.Show("Enter pressed!")
         e.Handled = True
    End If

End Sub

KeyPress 대신 KeyDown 이벤트 사용

If e.KeyCode = Keys.Enter Then
   MsgBox ("You pressed enter")
End if

참고: 양식에 ACCEPT BUTTON이 설정되어 있지 않은지 확인합니다.AcceptButton은 '없음'으로 설정합니다.

저도 같은 문제가 있었는데 Framework 2.0에서 이 답변을 할 수 없어서 더 깊이 파고들었습니다.

먼저 텍스트 상자에서 PreviewKeyDown을 처리해야 ENTER가 오면 IsInputKey를 설정하여 텍스트 상자의 keyDown 이벤트로 처리하거나 전달할 수 있습니다.다음과 같이:

Private Sub txtFiltro_PreviewKeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PreviewKeyDownEventArgs) Handles txtFiltro.PreviewKeyDown
    Select Case e.KeyCode
        Case Keys.Enter
            e.IsInputKey = True
    End Select
 End Sub

그런 다음 텍스트 상자에서 이벤트 키를 아래로 누릅니다.답 중 하나는 올바른 경로에 있었지만 e를 설정하지 못했습니다.입력 키입니다.

Private Sub txtFiltro_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles txtFiltro.KeyDown
    If e.KeyCode = Keys.Enter Then
        e.handled = True
        Textbox1.Focus()
    End If
End Sub
Private Sub BagQty_KeyPress(sender As Object, e As KeyPressEventArgs) Handles BagQty.KeyPress

        Select e.KeyChar

            Case Microsoft.VisualBasic.ChrW(Keys.Return)
                PurchaseTotal.Text = Val(ActualRate.Text) * Val(BagQty.Text)
        End Select


    End Sub

이 코드를 사용하면 사용자가 Enter 키를 누를 때 동작과 같은 탭을 얻는 데 도움이 될 수 있습니다.

 Private Sub TxtSearch_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles TxtSearch.KeyPress
    Try
        If e.KeyChar = Convert.ToChar(13) Then
           nexttextbox.setfoucus 
        End If
    Catch ex As Exception
        MsgBox(ex.Message)
    End Try
End Sub

다음 코드가 작동합니다.

Public Class Form1
    Private Sub TextBox1_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress
        If e.KeyChar = Convert.ToChar(13) Then
            MsgBox("enter key pressd ")
        End If
    End Sub
End Clas

Public Class Form1
    Private Sub TextBox1_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyDown
        If e.KeyCode = Keys.Enter Then
            MsgBox("enter key pressd ")
        End If
    End Sub
End Class

이 코드를 사용하면 정상적으로 작동합니다.TextBox1을 클릭한 다음 이벤트로 이동하여 Keyup을 선택하고 두 번 클릭해야 합니다.그러면 SUB에 대한 대사를 얻을 수 있습니다.

Private Sub TextBox1_KeyUp(ByVal sender As System.Object, ByVal e As      
System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyUp
    If e.KeyCode = Keys.Enter Then
        MsgBox("Fel lösenord")

    End If
End Sub

Visual Studio 2019에서 이 코드를 테스트했습니다.

그것의 작동은 훌륭합니다.

양식 코드에 붙여넣기만 하면 됩니다.

동일한 양식의 모든 텍스트 상자에서 작동합니다.

Protected Overrides Function ProcessCmdKey(ByRef msg As System.Windows.Forms.Message, ByVal keyData As System.Windows.Forms.Keys) As Boolean
    Dim keyCode As Keys = CType(msg.WParam, IntPtr).ToInt32
    Const WM_KEYDOWN As Integer = &H100

    If msg.Msg = WM_KEYDOWN AndAlso keyCode = Keys.Enter _
     AndAlso Me.ActiveControl.GetType.Name = "TextBox" Then
        Me.SelectNextControl(Me.ActiveControl, True, True, False, True)
        Return True

    End If
    Return MyBase.ProcessCmdKey(msg, keyData)


End Function

언급URL : https://stackoverflow.com/questions/2752424/detecting-enter-keypress-on-vb-net

반응형