Greetings all,
Is there a built in way to know when a user is done typing into a textbox? (Before hitting tab, Or moving the mouse) I have a database query that occurs on the textchanged event and everything works perfectly. However, I noticed that there is a bit of lag of course because if a user is quickly typing into the textbox the program is busy doing a query for each character. So what I was hoping for was a way to see if the user has finished typing. So if they type "a" and stop then an event fires. However, if they type "all the way" the event fires after the y keyup.
I have some ideas floating around my head but I'm sure they aren't the most efficient. Like measuring the time since the last textchange event and if it was > than a certain value then it would proceed to run the rest of my procedures.
let me know what you think.
Language: VB.NET Framework: .Net 2.0
--Edited to clarify "done typing"
One approach:
Create a Timer
with an Interval
of X milliseconds
The interval should be about 300ms; more than a normal time between keystrokes, and also reasonable time to wait between finishing and the update occurring
In the input's TextChanged
event, Stop()
and then Start()
the Timer
This will restart the Timer
if it is already running, so if the user keeps typing at a normal rate, each change will restart the timer.
In the timer's Tick
event, Stop()
the Timer
and do the long transaction
Optional: Handle the Leave
and KeyDown
events so that leaving the control or pressing Enter will Stop()
the Timer
and do the long transaction.
This will cause an update if the text has changed, and the user hasn't made any changes in X milliseconds.
One problem with the "Measure the time since the last update" approach you're considering is that if the last change is made quickly, the update won't happen, and there won't be any subsequent changes to trigger another check.
Note: There must be a one to one pairing between TextBox
es and Timer
s; if you're planning on doing this with more than one input, I'd consider building a UserControl
that wraps this functionality.