2010-02-01 5 views
5

Je travaille en C# avec une zone de texte qui sert d'entrée pour une recherche d'enregistrement de base de données (Access SQL) par numéro d'identification. Je veux être en mesure d'utiliser la saisie semi-automatique dans la zone de texte, mais avec certaines limitations. Le gros problème est que le nombre d'ID dans le système est de l'ordre de milliers. Au lieu de remplir une fois la boîte de saisie semi-automatique, je dois surveiller ce qui se trouve dans la zone de texte et afficher uniquement les suggestions de saisie semi-automatique. quand il y a environ 50 choix ou moins.C# AutoComplete de zone de texte: Limiter à ~ 50 suggestions

Actuellement, je fais cette requête sur chaque KeyDown: SELECT COUNT (*) FROM Table WHERE id LIKE '% TextBox.Text'

Lorsque le nombre est inférieur à 50 je remplir la saisie semi-automatique des résultats de une version d'identification SELECT de l'instruction ci-dessus. Cela m'a conduit à plusieurs problèmes, la plupart semblent être des bizarreries C# Je ne comprends pas. 1) Lorsque j'efface ou que j'ajoute à AutoCompleteCustomSet dans un seul événement KeyDown, la touche enfoncée n'est pas ajoutée à la chaîne (c'est-à-dire que le comportement d'entrée de la zone de texte normal ne se produit pas).

2) J'ai essayé de séparer la mise à jour AutoCompleteCustomeSet d'un événement différent (KeyPress ou KeyUp), mais cela a entraîné un plantage, ou l'affichage de saisie semi-automatique ne s'affichait que brièvement avant d'être masqué. Je me sens comme ce problème doit être commun et je vais juste à ce sujet dans le mauvais sens. Quelqu'un peut-il offrir quelques conseils? Merci!

EDIT: ceci est Windows Forms

EDIT2: Un top 50 sélectionnez ne résout pas le problème que les types d'utilisateurs (et potentiellement backspaces et re-types) les 50 premiers changeront. Vous ne pouvez pas simplement sélectionner TOP 50 à partir de la table WHERE ...?

+1

Est-ce WinForms? WPF? ASP.NET? – LBushkin

Répondre

1

Avez-vous essayé l'événement TextChanged à la place? Je m'attendrais à ce que cet événement soit déclenché APRÈS que la zone de texte ait été mise à jour, évitant ainsi les bizarreries que vous mentionnez.

+0

Merci, cela a fonctionné. Une partie de mon problème appelait également Clear() sur AutoCompleteCustomSet à chaque pression de touche. Apparemment, ce n'est pas vraiment nécessaire, et cela a eu des effets secondaires négatifs. – Rich

0

0

Limiterait-elle simplement vos suggestions à 50 travail pour vous? Lorsque votre sélection de vos suggestions, vous pouvez utiliser une requête comme ceci:

SELECT TOP 50 * FROM VotreTable OÙ .....

0

La raison pour laquelle vous obtenez l'accident peut être que vous get a race condition lors du remplacement de la source de saisie semi-automatique, qui est utilisé par un fil d'arrière-plan pour calculer les candidats pendant que vous tapez (ou vous mettre null au lieu de String.Empty dans la liste des candidats)

Avant Windows Vista, l'objet de saisie semi-automatique match candidates with prefix only ne remplit pas les chaînes candidates ne commençant pas par la chaîne typée.

Use IAutoCompleteDropDown::ResetEnumerator to reset the candidate list.

Questions connexes