Как обрабатывать событие TextChanged только тогда, когда пользователь перестает печатать? - PullRequest
8 голосов
/ 24 июня 2010

У меня есть TextBox с событием TextChanged. В конце концов, он делает запрос к базе данных SQL, поэтому я хочу ограничить количество запросов.

Я хочу сделать запрос , только если пользователь не нажал клавишу , скажем .. 300 миллисекунд или около того. Если по какой-то причине предыдущий запрос все еще выполняется, мне нужно отменить его, а затем выполнить новый запрос.

Ответы [ 5 ]

8 голосов
/ 24 июня 2010

Создайте System.Windows.Forms.Timer и сбрасывайте его (например, останавливайте, затем запускайте) после каждого нажатия клавиши.Если событие таймера сработало, отключите таймер.

1 голос
/ 08 декабря 2015

Благодаря идее @ Брайана и этого ответа я придумал собственную версию использования таймера для решения этой проблемы.Это работало нормально для меня.Надеюсь, это поможет и другим:

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 голос
/ 24 июня 2010

Используйте Reactive Framework для запуска последовательности событий. Я не уверен точно , как это будет работать, но вы можете прочитать об этом здесь ( Reactive Extensions for .NET ) и посмотреть, будет ли оно соответствовать вашим потребностям. Здесь также есть множество примеров: Примеры . Пример "регулирования" может быть тем, что вы ищете.

0 голосов
/ 24 июня 2010

1) Создать таймер.

2) Создайте обработчик для события Tick вашего таймера.На каждом тике проверяйте, прошло ли достаточно времени простоя, и, если он есть, ОСТАНОВИТЕ таймер и выполните запрос.

3) Всякий раз, когда в этом текстовом поле происходит нажатие клавиши, перезапустите таймер.

0 голосов
/ 24 июня 2010

Добавьте второй actionlistener, который вызывается всякий раз, когда пользователь нажимает любую клавишу, и когда он вызывается, сохраните текущее время в глобальной переменной. Затем, когда вызывается ваше событие TextChanged, оно проверяет разницу во времени между глобальной переменной и текущим временем.

Если разница составляет менее 300 миллисекунд, запустите таймер для выполнения запроса через 300 миллисекунд. Затем, если пользователь нажимает другую клавишу, он сначала сбрасывает таймер.

...