如何仅在用户停止键入时处理TextChanged事件?

我有一个带有TextChanged事件的TextBox 。 最后它正在查询SQL数据库,所以我想限制查询的数量。

如果用户没有在300毫秒左右按下一个键 ,我只想进行查询。 如果由于某种原因上一个查询仍在执行,我需要取消它,然后发出一个新查询。

创建一个System.Windows.Forms.Timer并在每次按键后重置它(例如停止然后启动它)。 如果触发了计时器事件,请禁用计时器。

使用Reactive Framework触发一系列事件。 我不确定这如何工作的,但你可以在这里阅读它( Reactive Extensions for .NET )并看看它是否能满足你的需求。 这里也有很多例子: 例子 。 “限制”示例可能是您正在寻找的。

感谢@ 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(); } 

1)创建一个计时器。

2)为计时器的Tick事件创建一个处理程序。 在每个刻度线上,检查是否已经过了足够的空闲时间,如果有,则停止计时器并执行查询。

3)每当在该文本框上发生按键时,重新启动计时器。

添加第二个actionlistener,只要用户按下任何键,就会调用它,并在调用它时将当前时间保存到全局变量。 然后,当调用TextChanged事件时,它会检查全局变量和当前时间之间的时差。

如果差异小于300毫秒,则启动计时器以在300毫秒后执行查询。 然后,如果用户按下另一个键,则首先重置计时器。