我有一个TextBox
有TextChanged
个事件。最后它正在查询SQL数据库,所以我想限制查询的数量。
如果用户没有按下,那么我只想查询,比如说.. 300毫秒左右。如果由于某种原因上一个查询仍在执行,我需要取消它,然后发出一个新查询。
答案 0 :(得分:8)
创建System.Windows.Forms.Timer
并在每次按键后重置它(例如停止然后启动它)。如果触发了计时器事件,请禁用计时器。
答案 1 :(得分:1)
使用Reactive Framework触发一系列事件。我不确定完全这是如何工作的,但你可以在这里阅读(Reactive Extensions for .NET),看看它是否能满足你的需求。这里也有很多例子:Examples。 “限制”示例可能是您正在寻找的。 p>
答案 2 :(得分:1)
感谢@ Brian的想法和this answer,我提出了自己的使用计时器来处理这个问题的版本。这对我来说很好。我希望它也有助于其他人:
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();
}
答案 3 :(得分:0)
添加第二个actionlistener,只要用户按下任何键,就会调用它,并在调用它时将当前时间保存到全局变量。然后,当调用TextChanged事件时,它会检查全局变量和当前时间之间的时差。
如果差异小于300毫秒,则启动计时器以在300毫秒后执行查询。然后,如果用户按下另一个键,它将首先重置计时器。
答案 4 :(得分:0)
1)创建一个计时器。
2)为计时器的Tick事件创建一个处理程序。在每个刻度线上,检查是否有足够的空闲时间,如果有,请停止计时器并执行查询。
3)每当在该文本框上发生按键时,重新启动计时器。