c # Прервать выполнение ключевого события из TextBox при следующем ключевом событии - PullRequest
0 голосов
/ 14 октября 2010

Я использую ввод из TextBox для фильтрации информации, отображаемой в ListBox. Я хочу, чтобы фильтрация происходила при каждом нажатии клавиши.

Проблема, с которой я сталкиваюсь, заключается в том, что если пользователь вводит второй, третий и т. Д. Символ, фильтр будет выполняться для каждого из нажатий клавиш. Например. Пользователь вводит «a», и фильтрация начинается, прежде чем фильтрация по букве «a» завершается, пользователь добавляет букву «b», поэтому полная строка поиска теперь равна «ab».

На этом этапе я хочу, чтобы первый фильтр полностью остановился и запустил новый фильтр с нуля.

private bool Interrupt = false;
private bool Searching = true;

private void tbxFilter_PreviewKeyDown(object sender, KeyEventArgs e)
{
    if (Searching)
    {
        Interrupt = true;
    }
}

private void tbxFilter_KeyUp(object sender, KeyEventArgs e)
{
    Searching = true;

    foreach (MyObject o in ListOfMyObjects)
    {
        if (Interrupt)
        {
            Interrupt = false;
            break;
        }
        else
        {
            DoFilter(o);
        }
    }

    Searching = false;
}

Приведенный выше код показывает примерно то, что у меня есть на данный момент, с удалением некоторых частей приложения (например, типов и имен объектов).

В идеале я хотел бы сделать паузу в начале второго нажатия клавиши (пока поиск не будет установлен в значение false - что означает, что все другие поиски завершены), но добавит цикл while для проверки этого просто заблокирует программу в этой точке.

Есть ли способ достичь этого?

Спасибо

РЕДАКТИРОВАТЬ: Элемент управления, который отображает элементы является элементом управления ListBox / ListView.

1 Ответ

0 голосов
/ 14 октября 2010

Я бы создал рабочий поток для фильтрации. Когда инициируется новый процесс фильтрации, работающий рабочий поток отменяется (с помощью установки флага или маркера отмены см. Класс задач .net 4.0).

Когда поток завершается, вы берете результат и отображаете его одним действием в потоке GUI.

...