Tengo un text donde el usuario debe ingresar un texto a buscar. Uso timer, el objeto no la función, haciendo que cada vez que el text cambie el intervalo del timer cambie a 2000 milisegundos. pero esto no ocurre. La idea es que el usuario escriba el texto a buscar y una vez que deje de escribir, se realizce la busqueda de forma automática sin que haya la necesidad de un botón para hacerlo. ¿Alguna idea de como hacer esto?
Hola,
El problema es que cambiar la propiedad Interval del Timer no reinicia su cuenta atrás, solo cambia cuánto va a tardar la próxima vez que se dispare desde donde iba. Para que de verdad se reinicie cada vez que el usuario teclea algo, hay que parar y volver a arrancar el temporizador explícitamente:
Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
Timer1.Stop()
Timer1.Interval = 2000
Timer1.Start()
End Sub
Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
Timer1.Stop()
RealizarBusqueda(TextBox1.Text)
End Sub
La lógica: cada vez que el usuario teclea algo, Timer1.Stop() cancela la cuenta atrás que estuviera en marcha, y Timer1.Start() la vuelve a arrancar de cero con 2000 ms. Si el usuario sigue escribiendo antes de que pasen esos 2 segundos, el Tick nunca llega a dispararse, porque cada pulsación reinicia el contador. Solo cuando el usuario deja de escribir durante 2 segundos completos, el Tick se ejecuta de verdad y lanzas la búsqueda.
Este patrón se llama debounce (amortiguar eventos que se disparan muy seguidos, quedarte solo con el último tras una pausa), y es exactamente lo mismo que hacen los buscadores tipo Google con el autocompletado: no lanzan una petición por cada tecla, esperan a que dejes de escribir un instante.
El Timer1.Stop() dentro del propio Tick es importante también: si no lo pones, el temporizador seguiría disparando el evento cada 2 segundos indefinidamente hasta que el usuario vuelva a teclear, en vez de disparar solo una vez.
David Carrero