9

我有TextBox一个TextChanged事件连接起来。最后它正在对 SQL 数据库进行查询,所以我想限制查询的数量。

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

4

5 回答 5

8

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

于 2010-06-24T18:17:30.703 回答
1

使用反应式框架触发一系列事件。我不确定这到底是如何工作的,但您可以在此处阅读它(Reactive Extensions for .NET),看看它是否能满足您的需求。这里也有很多例子:Examples。“节流”示例可能是您正在寻找的。

于 2010-06-24T17:59:53.463 回答
0

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

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

于 2010-06-24T17:57:57.480 回答
0

1)创建一个计时器。

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

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

于 2010-06-24T18:17:40.417 回答
0

感谢@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();
}
于 2015-12-08T05:45:27.557 回答