2 votes

Comment gérer KeyDown en VB.NET

Voici mon dilemme : voici le code que j'ai :

   If e.KeyCode = Keys.A Then
        TextBox1.AppendText("C, ")
        PictureBox2.Visible = True
        My.Computer.Audio.Play(My.Resources.C, AudioPlayMode.Background)
   End If

Maintenant, lorsque j'entre ceci sous Form1_KeyDown, visual basic pense ceci :

'KeyCode n'est pas un membre de 'System.EventArgs'

J'ai déjà vu ce code fonctionner, mais ce n'est pas le cas ici. Un coup de main ?

Voici le code complet :

Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs)
    If e.KeyCode = Keys.A Then
        TextBox1.AppendText("A, ")
        PictureBox2.Visible = True
        My.Computer.Audio.Play(My.Resources.C, AudioPlayMode.Background)
    End If
    If e.KeyCode = Keys.S Then
        TextBox1.AppendText("C,")
        PictureBox14.Visible = True
        My.Computer.Audio.Play(My.Resources.D, AudioPlayMode.Background)
    End If
End Sub

6voto

Noldorin Points 67794

Je ne sais pas pourquoi la définition de votre méthode déclare e comme EventArgs mais la solution consiste simplement à faire en sorte que le paramètre soit de type KeyEventArgs . Cela s'explique par le fait que EventArgs (naturellement) ne contient pas de propriété appelée KeyCode mais KeyEventArgs fait !

Modifiez la définition de la méthode de votre gestionnaire d'événements comme suit :

Private Sub foo_KeyDown(sender As Object, e As KeyEventArgs)
    If e.KeyCode = Keys.A Then
        TextBox1.AppendText("A, ")
        PictureBox2.Visible = True
        My.Computer.Audio.Play(My.Resources.C, AudioPlayMode.Background)
    ElseIf e.KeyCode = Keys.S Then
        TextBox1.AppendText("C,")
        PictureBox14.Visible = True
        My.Computer.Audio.Play(My.Resources.D, AudioPlayMode.Background)
    End If
End Sub

0voto

Joshua Points 5367

Il semble que votre méthode utilise le mauvais EventArgs. L'événement Control.KeyDown l'envoie en tant que System.Windows.Forms.KeyEventArgs. Votre code devrait donc se lire comme suit

Private Sub Form1_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs)
   // code here
End Sub

0voto

Kevin Suttle Points 1174

J'ai constaté qu'il est parfois nécessaire de fournir le type d'objet complet, comme ci-dessous :

Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
MsgBox(e.KeyCode.ToString()) 'Message what the keycode
If (e.KeyCode = Keys.A) Then
    MsgBox("e.KeyCode = Keys.A") 'Message that I've found the A
    TextBox1.AppendText("C, ")
    PictureBox2.Visible = True
    My.Computer.Audio.Play(My.Resources.C, AudioPlayMode.Background)
End If

End Sub

Avez-vous également essayé de tester ceci dans une zone de texte du formulaire similaire à celle ci-dessous (la zone de texte de l'exemple est nommée TextBoxKeyTest) ?

    Private Sub TextBoxKeyTest_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBoxKeyTest.KeyDown
    MsgBox(e.KeyCode.ToString())'Message what the keycode
    If (e.KeyCode = Keys.A) Then
        MsgBox("e.KeyCode = Keys.A")'Message that I've found the A
        TextBox1.AppendText("C, ")
        PictureBox2.Visible = True
        My.Computer.Audio.Play(My.Resources.C, AudioPlayMode.Background)
    End If
End Sub

0voto

user2099403 Points 1

Cela devrait fonctionner en VB 2010

Private Sub cmdWiden_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyUp
        If e.KeyCode = Keys.Up Then Me.Top = Me.Top - 5
        If e.KeyCode = Keys.Down Then Me.Top = Me.Top + 5
        If e.KeyCode = Keys.Left Then Me.Left = Me.Left - 5
        If e.KeyCode = Keys.Right Then Me.Left = Me.Left + 5
End Sub

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X