我有TextBox
一个TextChanged
事件连接起来。最后它正在对 SQL 数据库进行查询,所以我想限制查询的数量。
如果用户在 .. 300 毫秒左右没有按下任何键,我只想进行查询。如果由于某种原因之前的查询仍在执行,我需要取消它,然后发出一个新的查询。
我有TextBox
一个TextChanged
事件连接起来。最后它正在对 SQL 数据库进行查询,所以我想限制查询的数量。
如果用户在 .. 300 毫秒左右没有按下任何键,我只想进行查询。如果由于某种原因之前的查询仍在执行,我需要取消它,然后发出一个新的查询。
每次按键后创建一个System.Windows.Forms.Timer
并重置它(例如停止然后启动它)。如果触发了定时器事件,则禁用定时器。
使用反应式框架触发一系列事件。我不确定这到底是如何工作的,但您可以在此处阅读它(Reactive Extensions for .NET),看看它是否能满足您的需求。这里也有很多例子:Examples。“节流”示例可能是您正在寻找的。
添加第二个 actionlistener,当用户按下任何键时调用它,当它被调用时,将当前时间保存到全局变量中。然后,当您的 TextChanged 事件被调用时,它会检查全局变量与当前时间之间的时间差。
如果差值小于 300 毫秒,则启动计时器以在 300 毫秒后执行查询。然后,如果用户按下另一个键,它会首先重置计时器。
1)创建一个计时器。
2) 为计时器的 Tick 事件创建一个处理程序。在每个滴答声上,检查是否有足够的空闲时间已经过去,如果已经过去,则停止计时器并执行查询。
3)每当在该文本框上发生按键时,重新启动计时器。
感谢@Brian 的想法和这个答案,我想出了我自己的使用计时器来处理这个问题的版本。这对我来说很好。我希望它也能帮助其他人:
private Timer _tmrDelaySearch;
private const int DelayedTextChangedTimeout = 500;
private void txtSearch_TextChanged(object sender, EventArgs e)
{
if (_tmrDelaySearch != null)
_tmrDelaySearch.Stop();
if (_tmrDelaySearch == null)
{
_tmrDelaySearch = new Timer();
_tmrDelaySearch.Tick += _tmrDelaySearch_Tick;
_tmrDelaySearch.Interval = DelayedTextChangedTimeout;
}
_tmrDelaySearch.Start();
}
void _tmrDelaySearch_Tick(object sender, EventArgs e)
{
if (stcList.SelectedTab == stiTabSearch) return;
string word = string.IsNullOrEmpty(txtSearch.Text.Trim()) ? null : txtSearch.Text.Trim();
if (stcList.SelectedTab == stiTabNote)
FillDataGridNote(word);
else
{
DataGridView dgvGridView = stcList.SelectedTab == stiTabWord ? dgvWord : dgvEvent;
int idType = stcList.SelectedTab == stiTabWord ? 1 : 2;
FillDataGrid(idType, word, dgvGridView);
}
if (_tmrDelaySearch != null)
_tmrDelaySearch.Stop();
}