问候所有,
是否有内置的方法来了解用户何时输入文本框?(在点击标签之前,或者移动鼠标)我有一个在textchanged事件上发生的数据库查询,一切都很完美.但是,我注意到当然存在一些延迟,因为如果用户正在快速键入文本框,则程序正忙于对每个字符进行查询.所以我希望的是一种查看用户是否已完成输入的方法.因此,如果他们键入"a"并停止,则会触发事件.但是,如果他们输入"一直",则事件在y键盘之后触发.
我脑子里浮现出一些想法,但我确信它们不是最有效的.就像测量自上次textchange事件以来的时间一样,如果它超过某个值,那么它将继续运行我的其余程序.
让我知道你的想法.
语言:VB.NET Framework:.Net 2.0
- 编写澄清"完成打字"
一种方法:
创建一个Timer
带有Interval
X毫秒
间隔应约为300ms; 击键之间的正常时间,以及在完成和更新之间等待的合理时间
在输入的TextChanged
事件中,Stop()
然后Start()
是Timer
这将重新启动Timer
,如果它已经在运行,所以如果用户一直以正常速度打字,每一次变化都会重启定时器.
在计时器的Tick
事件,Stop()
在Timer
做长事务
可选:处理Leave
和KeyDown
事件,以便离开控制或按Enter会Stop()
的Timer
,做长事务.
如果文本已更改,则会导致更新,并且用户未在X毫秒内进行任何更改.
您正在考虑的"测量自上次更新以来的时间"方法的一个问题是,如果快速进行最后一次更改,则不会发生更新,并且不会有任何后续更改来触发另一次检查.
注意:TextBox
es和Timer
s 之间必须有一对一的配对; 如果您计划使用多个输入执行此操作,我会考虑构建一个UserControl
包含此功能的程序.
对于那些在.NET 2.0中需要这样的东西的人来说,我在这里制作了一个源自TextBox并使用相同方法的Control ..希望这个帮助
public partial class TextBox : System.Windows.Forms.TextBox { private ManualResetEvent _delayMSE; public event EventHandler OnUserStopTyping; private delegate bool TestTimeout(); public TextBox() { _delayMSE = new ManualResetEvent(false); this.TextChanged += new EventHandler(TextBox_TextChanged); } void TextBox_TextChanged(object sender, EventArgs e) { _delayMSE.Set(); Thread.Sleep(20); _delayMSE.Reset(); TestTimeout tester = new TestTimeout(TBDelay); tester.BeginInvoke(new AsyncCallback(Test), tester); } private void Test(IAsyncResult pResult) { bool timedOut = (bool)((TestTimeout)pResult.AsyncState).EndInvoke(pResult); if (timedOut) { if (OnUserStopTyping != null) OnUserStopTyping(this, null); } } private bool TBDelay() { return !_delayMSE.WaitOne(500, false); } }