7
votes

L'événement SELECTEDEXchangedExchangedExchangedExchanged de Combobox n'est pas appelé Entrée

Je travaille sur VS 2010 avec VB à l'aide de .NET Framework 4.0

J'ai un Combobox . Il y a des objets et les affichent bien. Voici là où il obtient un peu bizarre:

Si je clique sur la flèche déroulante sur le comboBox et cliquez sur l'élément que je veux, sélectionnéexchanged est appelé - bon.

Si je clique dans la zone de texte du Combobox et commencez à taper ce que je veux sélectionné et fini en appuyant sur la touche UP (ou Bas), SélectionnéExchangeed est appelé - aussi bon.

Si je clique sur la flèche déroulante du Combobox et commencez à taper ce que je veux sélectionner et terminez-le en appuyant sur Entrée , sélectionnéeExchanged n'est pas appelé - problème.

existe un événement différent causé par le Entrée dans le dernier cas? J'ai essayé d'utiliser le textchanged et textupdate événements, mais ceux-ci ne semblent pas fonctionner: xxx

devrait J'utilise quelque chose en dehors de e.equals (Keys.equals) ?

Y a-t-il un autre événement que je devrais rechercher?

EDIT: < / fort> Un exemple des éléments du Combobox sont:

  • 10 - Nouvelle entrée et chèque de complétude ---> Ceci est le type le plus courant
  • 13 - attribué à TRB / HRB ---> Il y en a quelques-uns avec '/'
  • 60 - externe (attendre jusqu'à nouvel ordre) ---> il y en a quelques-uns avec '(' et ')'

    Fondamentalement, le type de chaque liste est "## - Quelque texte".


1 commentaires

Le problème est que la sélection sélectionnée ne soit pas appelée lorsque la valeur est saisie et modifie l'index sélectionné. POURQUOI?


9 Réponses :


2
votes

S'abonner à l'événement Keauprimé:

Private Sub yourComboBox_KeyPressed(sender As System.Object, e As System.KeyPressedEventArgs) Handles yourComboBox.KeyPressed
    If e.KeyChar.Equals((char)Keys.Enter) Then
        Call SomeMethod()
End If


0 commentaires

2
votes

Cela aidera vos problèmes xxx


2 commentaires

C'est un peu plus proche; L'événement est appelé, mais cela ne modifie pas réellement l'index du Combobox .


En fait, ce dont vous avez besoin, s'il vous plaît dites-moi les détails ..... Dans le code ci-dessus, si vous appuyez sur la touche Entrée de l'index particulier du ComboBox, vous pouvez effectuer des fonctions à l'intérieur de l'événement clé.



6
votes

Disclaimer: Ceci est écrit en C # - laissez-moi savoir si vous en avez besoin si vous en avez besoin traduit en vb. xxx

intéressant, le DOCS Dites que nous devrions utiliser l'événement SELECTIONCHANGECOMMITATED au lieu de la < Code> sélectionnéeExchanged événement lors de la manipulation des modifications de sélection effectuées par l'utilisateur. Il est nécessaire de le faire dans ce cas que l'événement SELECTEXCHANDDEXCHANGED SELECTEXCHANGED aise deux fois à l'aide de mon approche.

EDIT:

à Empêchez l'utilisateur de devoir taper la chaîne entière, utilisez l'avis de la réponse de l'ADI: accédez aux propriétés de la liste déroulante et de réglage SET SET autocompletemode sur suggestionAppend et et et Autocompéquation Source à Listitems - J'utilise ces paramètres lors de la création de ma réponse, il devrait donc fonctionner pour vous.


5 commentaires

J'apprécie cela, mais je ne veux pas que l'utilisateur ait à taper la chaîne entière dans la liste déroulante pour trouver une correspondance (certaines des chaînes ont plus de 20 caractères) Ce n'est pas ce dont j'ai besoin. Grand extrait cependant. Merci!


Gaaaah, il se ferme réellement. Ok, cela fait reconnaître qu'il y a un changement d'index. Cependant, peu importe ce que je tape (quel que soit l'indice que je souhaite d'aller à), sur Entrer, il est défini sur le premier élément de la liste.


Il semble que c'est bon sur le texte, mais quand il devient if (((((index = combin01.findstringexact (combinobox1.text)) <> -1) Il s'agit simplement de retourner 1 ... Ça ne trouve pas l'index de la chaîne ...


@redhotspike Pourriez-vous mettre à jour votre question avec les articles réellement contenus dans la combinaison? Assurez-vous également que Combobox1 est le nom correct de votre code.


J'ai édité ma question pour inclure un échantillon d'éléments Combobox.



4
votes
Private Sub ComboBox1_KeyUp(sender As System.Object, e As System.Windows.Forms.KeyEventArgs) Handles ComboBox1.KeyUp
    If e.KeyCode = Keys.Enter Then
        MessageBox.Show(ComboBox1.SelectedText)
        Call SomeMethod()
    End If
End Sub

1 commentaires

Cela fonctionnerait bien en conjonction avec ce que @adikonstantin suggère, mais le texte est édité lorsque l'utilisateur appuie sur ENTER après une correspondance. Avez-vous des suggestions pour cela?



2
votes

Pouvez-vous me faire savoir si cela fonctionne pour vous?

    Private Sub ComboBox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles ComboBox1.KeyPress
      If e.KeyChar = Chr(13) Then
        ComboBox1_SelectedIndexChanged(sender, e)
      End If
    End Sub

    Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
      MsgBox(ComboBox1.Text)
      'Your code here
    End Sub


1 commentaires

merci mais il a eu le même résultat que la suggestion de @sean Vaughn



3
votes

Je crois que vous devriez définir autocompletémode sur suggestippend et autocompéquade à listitems . De cette façon, si ce que vous tapez est durable avec les éléments chargés sur ComboBox, en l'écrivant et en trouvant cet élément, lorsque vous appuyez sur Entrée , le sélectionnéExchanged sera déclenché (Même si un match ne serait pas trouvé - le premier de la liste sera sélectionné)

J'ai préparé Quelque chose pour vous indiquer cela.

Cordialement,

adi konstantin


1 commentaires

Ceci est définitivement plus proche de ce dont j'ai besoin - sauf lorsque une correspondance est trouvée et que l'utilisateur clique sur Entrée, le texte dans le comboBox est effacé ... Toute suggestion?



4
votes
Option Strict On
Public Class Form1
    Friend WithEvents ComboBox1 As New ComboBox With {.Parent = Me}
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
        ComboBox1.Items.AddRange({"hello", "tes1ted", "word", "item", "tes2ted"})
        ComboBox1.Text = ComboBox1.Items(0).ToString
    End Sub
    Private Sub ComboBox1_KeyUp(ByVal sender As Object, ByVal e As KeyEventArgs) Handles ComboBox1.KeyUp
        'You can put this in the keydown event, or adapt it a small bit and put it in the keypress event
        'putting it in the textchanged event is problematic and not recommended.
        Dim OriginalText As String = ComboBox1.Text
        If e.KeyCode = Keys.Enter Then
            If ComboBox1.SelectionLength > 0 Then
                ComboBox1.Text = ComboBox1.Text
                ComboBox1.SelectionLength = 0
                ComboBox1.SelectionStart = ComboBox1.Text.Length
            End If
        End If
        If Not IsTextKey(e.KeyCode) Then Exit Sub
        Dim Filter As String = ComboBox1.Text & "*"
        If Filter.Length = 1 Then Exit Sub
        For I = 0 To ComboBox1.Items.Count - 1
            If LCase(ComboBox1.Items(I).ToString) Like LCase(Filter) Then
                ComboBox1.SelectedItem = ComboBox1.Items(I)
                ComboBox1.Select(OriginalText.Length, (ComboBox1.Text.Length - OriginalText.Length))
                Exit Sub
            End If
        Next
    End Sub
    Function IsTextKey(ByVal Key As Integer) As Boolean
        Select Case True
            Case Key = Keys.Up : Return False
            Case Key = Keys.Down : Return False
            Case Key = Keys.Left : Return False
            Case Key = Keys.Right : Return False
            Case Key = Keys.Back : Return False
            Case Key = Keys.Delete : Return False
            Case Key = Keys.LWin : Return False
            Case Key = Keys.RWin : Return False
                'add whatever I missed
                'return false if the key either removes text from the textbox 
                'or does not produce a character
            Case Else
                'return true if the key produces a visible character(including space)
                Return True
        End Select
    End Function
End Class

4 commentaires

C'est génial! Wow. C'est surtout fonctionne. Le seul problème qu'il a est de savoir s'il ya un / dans la chaîne - il modifie l'index, mais la chaîne ne se renseie pas dans le comboBox .


lol donc fait travaille ... mais seulement si je tape vraiment rapide et appuyez sur Entrez vraiment rapidement. Il essaie de filtrer après chaque clé, ce qui n'est pas recherché.


Alors changez quel événement vous faites votre filtrage et modifiez-le à vos besoins.


Vous pouvez supprimer la partie qui met en évidence la pièce "supposée" et le faire où il sélectionne juste le premier match fidèlement, de sorte que vous n'aurez pas à appuyer sur Entrée, mais cela résoudra "Test1" lorsque vous êtes à Taper "test", même si vous alliez taper "Test2" ... Je pense que cela devrait résoudre votre problème



0
votes

Fermez la liste manuellement sur l'événement de la prévisualisation:

Private Sub cmbStatus_PreviewKeyDown(sender As ComboBox, e As PreviewKeyDownEventArgs) Handles cmbStatus.PreviewKeyDown
    If e.KeyCode = Keys.Enter Then sender.DroppedDown = False
End Sub


0 commentaires

2
votes

J'ai eu un problème similaire lorsque le ComboBox Dropdownstyle a été défini sur Simple avec Autocomplète défini pour ajouter, Sourcing de mes Listitems. Ma solution de contournement était d'avoir une variable de chaîne Save the ComboBox Text sur chaque événement textchanged. De cette façon, lorsque l'entrée est enfoncée, vous pouvez récupérer le texte supprimé et le réaffecter au texte ComboBox.

'' Déclaration globale xxx

Il y a de bonnes réponses ci-dessus, Mais j'ai aimé que je n'ai pas besoin de régler toutes les clés de commande et les flèches, etc.


0 commentaires