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

时间:2010-06-24 17:54:06

标签: c# winforms textbox textchanged

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

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

5 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:1)

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

答案 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)每当在该文本框上发生按键时,重新启动计时器。