代码之家  ›  专栏  ›  技术社区  ›  esac

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

  •  8
  • esac  · 技术社区  · 15 年前

    我有一个 TextBox 用一个 TextChanged 事件已接通。最后,它对一个SQL数据库进行查询,所以我想限制查询的数量。

    我只想查询一下 如果用户没有按键 在说…大约300毫秒。如果出于某种原因前一个查询仍在执行,我需要取消它,然后发出一个新的查询。

    5 回复  |  直到 10 年前
        1
  •  8
  •   Brian    15 年前

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

        2
  •  1
  •   Garo Yeriazarian Changal Rayudu    15 年前

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

        3
  •  1
  •   Community Mohan Dere    8 年前

    感谢@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();
    }
    
        4
  •  0
  •   seraphym    15 年前

    1)创建计时器。

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

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

        5
  •  0
  •   Kyra    15 年前

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

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