2010-12-28 7 views
2

Я стараюсь развернуть список результатов путем динамического поиска в текстовом поле.Динамический результат поиска C#

Теперь я обновить запись, когда:

 SearchBox.TextChanged += new EventHandler(SearchBox_TextChanged);` 

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

поэтому, если я ищу пример «com», результат не содержит слов, содержащих «com», а только «c».

Для иметь результат «ком» я должен написать: «с» -> Дождитесь завершения поиска «о» -> Дождитесь завершения поиска «м» -> Дождитесь завершения Поиск

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

Спасибо.

ответ

1

Вы не знаете, что пользователь хочет, чтобы вставить в текстовое поле, так что может быть это Cat, Contact, Com, Компьютер, ... Таким образом, вы должны ограничить список поиска по каждому ключевому слову от пользователя, также вы можете установить политику, например, просто выполнить поиск, если входная длина не менее 3.

Редактировать: Другой способ - используйте Lazy pattern, означает, что в последний раз текст изменился, затем в другом потоке (например, таймер) проверьте, есть ли больше, чем 2 секунды между последним изменением пользователя на текущее время, обновите свой поиск: (интервал таймера составляет 2 секунды).

private DateTime lastChange = DateTime.Now; 
private bool textChanged = false; 
object lockObject = new object(); 

private void textChanged(object sender, EventArg e) 
{ 
    lock(lockObject) 
    { 
     lastChange = DateTime.Now; 
     textChanged = true; 
    } 
} 

private void timer1_Tick(object sender, EventArgs е) 
{ 
    lock(lockObject) 
    { 
     if (textChanged && lastChange > DateTime.Now.AddSeconds(-2)) // wait 2 second for changes 
     { 
      UpdateList(); // or the method for searching. 
      textChanged = false; 
      lastChange = DateTime.Now; 
     } 
    } 
} 
+0

Ваш ответ лучший, можете ли вы рассказать мне, как включить и отключить таймер? Благодаря! – Leen15

+0

@ Leen15, в начале программы. –

1

самый простой способ добавить в обработчик событий состояние как минимальная длина

private void SearchBox_TextChanged(Event e,...){ 
    if(e.text.Length > 3) 
     search(e.text); 
    } 
+0

У меня также слово небольшой длины 3 .. нет другого решения? таймер? – Leen15

+0

Вы также можете дождаться потерянного фокусного события. Затем, когда фокус переходит к чему-либо еще, поиск продолжается. – ykatchou

+0

Последнее решение - создать список доступного ключевого слова и показать его в реальном времени. – ykatchou

0

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

Когда пользователь перестанет печатать, таймер выполнит и выполнит поиск.

1

Использовать Timer. На каждом TextChanged случае,

  • старта, что таймер, если не работает,
  • рестарта (остановка & старт), если уже запущен,

На Tick события Timer «s, написать код для обновления Поиск Результаты и таймер остановки.

Это даст вашим пользователям некоторое время для написания полных ключевых слов поиска.

Обычно Timer Interval может быть около 1 секунда.

+0

Большое спасибо, я стараюсь! :) – Leen15

+0

Таймер недостаточно, вам следует использовать блокировку для предотвращения нежелательного поиска, а также нужно некоторое логическое выражение, чтобы сказать, что поиск выполнен или нет с последними изменениями, если вы обновляете список каждую секунду, это плохо, поскольку текущее решение OP имеет. –

0

Вы можете использовать таймер с интервалом около 2 секунд и реализовать поиск в таймерном событии Tick. Включите таймер в событии TextChanged и после завершения поиска отключите таймер в событии Tick.

Смежные вопросы