J'ai une liste déroulante que je ne veux pas que les utilisateurs ajoutent de nouvelles données, mais je veux aussi les laisser taper le titre de l'objet qu'ils veulent sélectionner.Auto-complétion restreinte sur la combobox
Actuellement, je suis en utilisant ce code:
protected virtual void comboBoxAutoComplete_KeyPress(object sender, KeyPressEventArgs e) {
if (Char.IsControl(e.KeyChar)) {
//let it go if it's a control char such as escape, tab, backspace, enter...
return;
}
ComboBox box = ((ComboBox)sender);
//must get the selected portion only. Otherwise, we append the e.KeyChar to the AutoSuggested value (i.e. we'd never get anywhere)
string nonSelected = box.Text.Substring(0, box.Text.Length - box.SelectionLength);
string text = nonSelected + e.KeyChar;
bool matched = false;
for (int i = 0; i < box.Items.Count; i++) {
if (((DataRowView)box.Items[i])[box.DisplayMember].ToString().StartsWith(text, true, null)) {
//box.SelectedItem = box.Items[i];
matched = true;
break;
}
}
//toggle the matched bool because if we set handled to true, it precent's input, and we don't want to prevent
//input if it's matched.
e.Handled = !matched;
}
Il fonctionne bien pour tout combobox qui utilise des données liées à une base de données, et est insensible à la casse. Cependant, si l'utilisateur saisit quelque chose dans le mauvais cas, puis tabule hors de la liste déroulante, la valeur sélectionnée de la liste déroulante est toujours -1 (ou quelle que soit la valeur précédente). Ce n'est pas le comportement que je veux, je veux qu'il mette la valeur à ce qui est actuellement la meilleure estimation de ce que l'utilisateur lie, c'est-à-dire l'option autocompleted.
J'ai essayé ceci, si vous voyez la ligne commentée dans la boucle for. Ça ne marche pas.
Il fait quelque chose comme ceci:
Je le champ "Rent" avec la valeur de 53
type I 'r'
je reçois le résultat 'rRent'
combobox.SelectedValue renvoie -1
ce qu'il fait actuellement:
Je le champ "Rent" avec la valeur de 53
type I 'r'
Autocomplete suggère "louer"
Il est la valeur correcte si je passe et le combobox désélectionné
COMBOBOX affiche « location »
combobox.SelectedValue retour -1
Ce que je veux:
Je le champ « Rent » avec la valeur de 53
type I « r »
le combobox perd le focus, il remplit « loyer » (même si ce n'est pas dans le cas correct [le fait déjà]) devrait maintenant revenir
combobox.SelectedValue 53
Je pense que le réglage de box.SelectedValue pourrait être meilleur mais je ne peux pas comprendre comment faire cela, au moins de manière abstraite de haut niveau, si je savais comment la combobox l'a fait avec ValueMemeber et Display member je le dupliquerais Je ne.
Est-ce que quelqu'un a des suggestions sur la façon de résoudre ce bug?
Pourquoi ne pas clairement le texte avant d'essayer d'ajouter le match à elle? – TheTXI
Je n'essaie pas d'ajouter la correspondance. Je viens de mettre à jour la question pour qu'elle ait plus de détails. – Malfist