我有一个带有已连接TextChanged
事件的 TextBox
。最终,它将向SQL数据库发出查询,因此我想限制查询的数量。
我只想在用户没有按键大约300毫秒左右时才进行查询。如果由于某些原因先前的查询仍在执行,我需要取消该查询,然后发出新的查询。
我有一个带有已连接TextChanged
事件的 TextBox
。最终,它将向SQL数据库发出查询,因此我想限制查询的数量。
我只想在用户没有按键大约300毫秒左右时才进行查询。如果由于某些原因先前的查询仍在执行,我需要取消该查询,然后发出新的查询。
System.Windows.Forms.Timer
并在每次按键后重置它(例如停止,然后启动它)。如果定时器事件被触发,则禁用定时器。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();
}
添加第二个ActionListener,每当用户按下任意键时调用它,并在调用时将当前时间保存到全局变量中。然后,当TextChanged事件被调用时,检查全局变量与当前时间之间的时间差。
如果时间差小于300毫秒,则启动一个计时器,在300毫秒后执行查询。如果用户按下另一个键,首先重置计时器。
1)创建一个计时器。
2)为计时器的Tick事件创建一个处理程序。在每个tick上检查是否已经过了足够的空闲时间,如果是,则停止计时器并执行查询。
3)每当文本框上发生键盘按键事件时,重新启动计时器。
System.Windows.Forms
命名空间中。请参阅http://msdn.microsoft.com/en-us/magazine/cc164015.aspx#S1。 - Brian