2008-12-08 9 views
0

Dans VB.NET, j'ai un Combobox sur un formulaire WinForm. Le formulaire permet à l'utilisateur de saisir une requête à rechercher. Lorsque l'utilisateur appuie sur la touche Entrée, une requête est effectuée sur la base de données et les résultats sont renvoyés en tant que DataTable. Le DataTable est ensuite lié au Combobox et l'utilisateur peut sélectionner l'option recherchée.Le gestionnaire d'événements Combobox KeyDown tirant plusieurs fois

Pour la plupart, cela fonctionne très bien. Cependant, nous avons découvert que le code s'exécutait plusieurs fois. Si j'écris ma requête et appuie une fois sur la touche Entrée, je peux parcourir le code DEUX ou TROIS fois. Je ne veux pas envoyer la même requête à la base de données plusieurs fois si je n'ai pas à le faire. Des idées ou des suggestions pour lesquelles le code s'exécuterait plusieurs fois?

Voici le code en question. Les noms Combobox et Function ont été modifiés pour protéger les innocents. :)

Private Sub cbx_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles cbx.KeyDown 

    Me.Cursor = Cursors.IBeam 
    If e.KeyData = Keys.Enter Then 
     Me.Cursor = Cursors.WaitCursor 
     PerformSearch() 
     Me.Cursor = Cursors.Default 
    End If 
    Me.Cursor = Cursors.Default 

End Sub 
+0

Vous ne disposez pas d'un autre gestionnaire d'événements défini ailleurs? Quelque chose comme AddHandler cbx.KeyDown, AddressOf Me.cbx_KeyDown – JamesSugrue

+0

J'ai eu le même problème avec l'événement keydown pour un formulaire. Merci pour la solution! – Jeff

+0

Sauf qu'il s'agit d'un événement de formulaire, la solution de mise au point ne fonctionne pas. :-( – Jeff

Répondre

1

Ironiquement, l'ajout de cbx.Focus() après que la recherche a été effectuée a résolu le problème. Voici la solution.

Private Sub cbx_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles cbx.KeyDown 

    Me.Cursor = Cursors.IBeam 
    If e.KeyData = Keys.Enter Then 
     Me.Cursor = Cursors.WaitCursor 
     PerformSearch() 
     cbx.Focus() 
     Me.Cursor = Cursors.Default 
    End If 
    Me.Cursor = Cursors.Default 

End Sub 
+0

Difficile à croire: il ne peut pas obtenir l'événement KeyDown s'il n'a pas le focus Attention aux touches non typées comme Shift, Control, Alt. –

Questions connexes