2010-02-01 16 views
5

Estoy trabajando en C# con un cuadro de texto que actúa como entrada para una base de datos (Access SQL) búsqueda de registros por número de identificación. Quiero poder usar Autocompletar en el cuadro de texto pero con algunas limitaciones.C# Cuadro de texto Autocompletar: Limitar a ~ 50 sugerencias

El gran problema es que el número de identificadores en el sistema es del orden de miles, así que en lugar de llenar el cuadro de Autocompletar una vez con todos, necesito monitorear lo que está en el cuadro de texto y solo mostrar las sugerencias de autocompletar cuando hay ~ 50 o menos opciones.

Actualmente, estoy haciendo esta consulta en cada KeyDown: SELECT count (*) de la tabla donde ID, como una 'TextBox.Text%'

Cuando el recuento es inferior al 50 lleno el autocompletar con los resultados de una versión de ID SELECTA de la declaración anterior. Esto me ha llevado a varios problemas, la mayoría parecen ser caprichos C# que no entiendo.

1) Cuando borro o agrego al AutoCompleteCustomSet dentro de un solo evento KeyDown, la clave real presionada no se agrega a la cadena (es decir, el comportamiento de entrada de cuadro de texto normal no ocurre).

2) Intenté separar la actualización de AutoCompleteCustomeSet en un evento diferente (KeyPress o KeyUp) pero esto provocó un bloqueo o la visualización de autocompletar solo se mostraría brevemente antes de ocultarse.

Siento que este problema debe ser común y lo estoy haciendo de la manera incorrecta. ¿Alguien puede ofrecer algún consejo? ¡Gracias!

EDIT: se trata de Windows Forms

Edit2: Una tapa 50 seleccione no soluciona el problema de que a medida que el usuario escribe (y potencialmente teclas de retroceso y re-tipos) de la parte superior 50 van a cambiar.

+1

¿Esto es WinForms? WPF? ASP.NET? – LBushkin

Respuesta

1

¿Usted intentó el evento TextChanged en su lugar? Espero que ese evento se dispare después de que se haya actualizado el cuadro de texto, evitando así las peculiaridades que mencionas.

+0

Gracias, esto funcionó. Parte de mi problema también era llamar a Clear() en AutoCompleteCustomSet en cada pulsación de tecla. Aparentemente esto no es realmente necesario, y hacerlo tuvo efectos secundarios negativos. – Rich

0

¿No puedes simplemente SELECCIONAR TOP 50 FROM Table WHERE ...?

0

¿Limitaría sus sugerencias a 50 para usted? Cuando su selección de sus sugerencias se puede utilizar una consulta como esta:

SELECT * FROM TOP 50 YourTable DONDE .....

0

La razón se obtiene accidente puede ser que get a race condition al sustituir la fuente de autocompletar, que es utilizado por un subproceso de fondo para calcular los candidatos al escribir (o ponerlo nulo en lugar de String.Empty en la lista de candidatos)

Antes de Windows Vista, el objeto Autocompletar match candidates with prefix only, por lo tanto, no llene cadenas candidatas que no comiencen con la cadena escrita.

Use IAutoCompleteDropDown::ResetEnumerator to reset the candidate list.

Cuestiones relacionadas