Zone de liste déroulante.SelectedValue ne correspond pas du texte affiché lorsque DropDownStyle = DropDownList dans Windows 7
Disons que nous avons le code suivant dans une application Windows:
ComboBox comboBox = new ComboBox()
{
AutoCompleteMode = AutoCompleteMode.SuggestAppend,
AutoCompleteSource = AutoCompleteSource.ListItems,
DataSource = new string[] { "", "Ark", "Boat", "Bucket" },
DropDownStyle = ComboBoxStyle.DropDownList
};
this.Controls.Add(comboBox);
TextBox textBox = new TextBox()
{
Left = comboBox.Right,
Top = comboBox.Top,
ReadOnly = true
};
textBox.DataBindings.Add("Text", comboBox, "SelectedValue");
this.Controls.Add(textBox);
Pas de magie ici, juste un ComboBox
lié à une liste de chaînes de caractères. Le TextBox
affiche le SelectedValue
de la ComboBox
.
Je reçois un comportement inattendu lorsque je tape "Seau" dans le ComboBox
et onglet loin. Pour une raison quelconque, le ComboBox
affiche "Bateau" mais le TextBox
affiche "Seau". Je voudrais attendre à la fois à l'affichage de "Seau".
Il se comporte comme prévu si je change le DropDownStyle
à DropDown
, mais je ne veux pas que les utilisateurs soient en mesure de taper ce qu'ils veulent. Ils devraient être en mesure de saisir les éléments qui sont dans la liste.
Encore plus intéressant, c'est que, après avoir tapé "Seau" et la tabulation loin, si je tape "Seau" de nouveau, il affichera "Seau" dans les deux. Si je fais une troisième tentative, elle remonte au "Bateau" pour la ComboBox
et "Seau" pour la `zone de texte'. Donc il semble que c'est le vélo à travers tous les B.
Je n'avais pas remarqué ce jusqu'à ce que j'ai mis à jour de XP à Windows 7 récemment. Je ne vois pas comment cela pourrait avoir quelque chose à voir avec cela, mais je suis jeter de toute façon.
Si ce comportement est correct, quelqu'un peut me dire ce que je devrais faire pour atteindre mon comportement attendu?
Mise à JOUR il semblerait qu'Il est liés à Windows 7. Tout se comporte comme prévu dans Windows XP Mode. Toute personne qui exécute Windows 7, essayez mon code et vérifier que je ne suis pas fou?
- J'ai pris votre code exactement qu'il jeta sur une nouvelle forme et ne peut pas reproduire le comportement. Vous pouvez essayer de câbler l'événement SelectedIndexChanged et de jeter quelques messages sur la console et de voir ce qui se passe que vous tapez dans la zone de liste déroulante.
- J'ai ajouté
comboBox.SelectedIndexChanged += new EventHandler(delegate { Console.WriteLine("SelectedIndex = {0}", comboBox.SelectedIndex); });
et la sortie, dit leSelectedIndex
changé à "2" et "3", ce qui correspond à ce que l'TextBox
montre. - Si c'est un bug reproductible, vous devez le soumettre à Microsoft Connecter sur: connect.microsoft.com/VisualStudio
- J'espérais que quelqu'un d'autre l'exécution de Win7 pourrait confirmer d'abord, mais je suis allé de l'avant et ouvert un bug: connect.microsoft.com/VisualStudio/feedback/....
- Je l'ai essayé et je peux repro trop (bien que je n'ai pas essayé de voir si il repros sur XP). J'ai upvoted votre Connect bug et déclarée je peux repro il. Cette question peut maintenant être fermé.
Vous devez vous connecter pour publier un commentaire.
Ce correctif permettra de résoudre cette question.
Une solution pourrait être la modification de la
DropDownStyle
àDropDown
et adjonction de ce qui suit:Qui permettra aux utilisateurs de taper quoi que ce soit, mais il ne les laissera pas l'onglet de contrôle, sauf si ils ont tapé un élément valide.
Encore, pas content du comportement de changer de XP à Win 7.
e.Cancel = Not (comboBox.Items.Contains(comboBox.Text))
.Je suis tombé sur moi-même et de trouver quelques solutions de contournement. En fin de compte, j'ai roulé ma propre solution comme une sous-classe ComboBox:
J'ai créé ma propre solution parce que je ne pense pas que le déploiement d'un correctif à tous les utilisateurs des ordinateurs était raisonnable ou gérable. Toutefois, le correctif de la description du problème décrit mon problème. Voir la liste ci-dessous par exemple:
Gland
Apple
Mauvais
Lit
Brique
Fromage
Si je suis en sélectionnant un élément commençant par B, tels que le Lit, il serait sélectionnez la première fois en commençant par B, ce qui serait Mauvais. C'est, si je ne tapez les deux premiers caractères (n'a pas de test de dactylographie ensemble de la chaîne de mon monde réel cas ce serait déraisonnable pour un utilisateur de le faire).
J'ai une liste déroulante avec les paramètres suivants:
AutoCompleteMode - SuggestAppend,
AutoCompleteSource - ListItems,
DropDownStyle - DropDownList.
Pour résoudre le problème j'ai fait la suite que j'ai remarqué que ma valeur désirée a été sélectionnée lors de l'événement SelectedIndexChanged mais pas l'événement Laisser.
L'événement Laisser semble à l'adresse de frapper la touche entrée. Le KeyUp (KeyDown n'a pas fonctionné) semblait fixer l'onglet question.
Je peux toujours reproduire cela sur Windows 10, alors j'ai pensé que je voudrais ajouter ma solution à la liste.
Je sais que cette réponse est assez vieux, mais j'ai été exigeant une réponse à cette Windows 7 bug. J'ai bricolé un peu dans la veine de Ecyrb et est venu avec le travail autour de:
De InitForm() pour l'Application Ajouter cette propriété:
D'où la zone de liste déroulante est situé:
Maintenant, dans mon exemple, je suis en utilisant une mesure de contrôle qui hérite de la zone de liste déroulante. De sorte que vous aurez besoin de fil de ces pour votre propre usage.
Remplacer la
OnTextChanged
méthode et il suffit de ne pas transmettre le message à la base.