Cj *_*son 16 .net vb.net textbox
问候所有,
是否有内置的方法来了解用户何时输入文本框?(在点击标签之前,或者移动鼠标)我有一个在textchanged事件上发生的数据库查询,一切都很完美.但是,我注意到当然存在一些延迟,因为如果用户正在快速键入文本框,则程序正忙于对每个字符进行查询.所以我希望的是一种查看用户是否已完成输入的方法.因此,如果他们键入"a"并停止,则会触发事件.但是,如果他们输入"一直",则事件在y键盘之后触发.
我脑子里浮现出一些想法,但我确信它们不是最有效的.就像测量自上次textchange事件以来的时间一样,如果它超过某个值,那么它将继续运行我的其余程序.
让我知道你的想法.
语言:VB.NET Framework:.Net 2.0
- 编写澄清"完成打字"
Dan*_*ant 34
一种方法:
创建一个Timer带有IntervalX毫秒
间隔应约为300ms; 击键之间的正常时间,以及在完成和更新之间等待的合理时间
在输入的TextChanged事件中,Stop()然后Start()是Timer
这将重新启动Timer,如果它已经在运行,所以如果用户一直以正常速度打字,每一次变化都会重启定时器.
在计时器的Tick事件,Stop()在Timer做长事务
可选:处理Leave和KeyDown事件,以便离开控制或按Enter会Stop()的Timer,做长事务.
如果文本已更改,则会导致更新,并且用户未在X毫秒内进行任何更改.
您正在考虑的"测量自上次更新以来的时间"方法的一个问题是,如果快速进行最后一次更改,则不会发生更新,并且不会有任何后续更改来触发另一次检查.
注意:TextBox es和Timers 之间必须有一对一的配对; 如果您计划使用多个输入执行此操作,我会考虑构建一个UserControl包含此功能的程序.
小智 5
对于那些在.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);
}
}
Run Code Online (Sandbox Code Playgroud)