2015-06-04 3 views
0

В настоящее время я использую текстовое поле для фильтрации некоторых записей. У меня есть обновление дисплея в текстовом поле TextChanged, поэтому пользователь не нажимает кнопку ввода или нажимает кнопку, чтобы начать фильтрацию. Я хочу использовать AutoCompleteStringCollection для запоминания записей, введенных в текстовое поле; однако, если я сохраняю каждую строку из текстового поля при запуске события TextChanged, тогда он сохранит все подстроки каждого члена фильтра.AutoCompleteStringCollection с событием TextChanged

Так, например, если я напечатал "тест" строка он будет отображать: "t" "te" "tes" "test" в качестве рекомендуемых строк. Я просто хочу, чтобы последняя строка была добавлена ​​в AutoCompleteStringCollection.

Я подумал о двух разных методах, которые я мог бы реализовать.

1) Я мог бы создать Task что ждет «х» количество времени после последнего события TextChanged, прежде чем он добавляет строку в AutoCompleteStringCollection. Если бы я это сделал, мне пришлось бы использовать cancelationToken для отмены задачи каждый раз при запуске события textChanged. Это немного сложнее, потому что я использую .NET 4.0.

2) Я мог бы также поиск через AutoCompleteStringCollection каждый раз, когда добавляется строка и Удалить все подстроки (которые начинаются в начале слова). Это может иметь неприятные последствия, если пользователь вводит более конкретный фильтр, но все же хочет сохранить более короткий.

Есть ли лучший способ сделать это? Какой метод вы бы порекомендовали?

ответ

1

При попытке динамического заполнения AutoCompleteStringCollection есть две вещи. Во-первых, это решение Microsoft по данному вопросу:

Не изменяйте список кандидатов автозаполнения динамически во время ключевых событий. (MSDN)

Сказав это, я смог выяснить способ динамического добавления элементов в список.

Я решил выбрать модифицированную версию реализации задачи. Вместо использования CancellationToken и TokenSource я использовал bool. Мой код закончился выглядеть примерно так:

private void AddSearchToDropDown() 
    { 
     Task.Factory.StartNew (() => 
     { 
     if (CanAdd && filterTxtBox.Text.Length > 2) 
     { 
      CanAdd = false; 
      Thread.Sleep (4000); 
      this.Invoke(new Action(() => 
      { 
       filterTxtBox.AutoCompleteMode = AutoCompleteMode.None; 
       m_suggestedTests.Add (filterTxtBox.Text); 
       filterTxtBox.AutoCompleteMode = AutoCompleteMode.Suggest; 
       CanAdd = true; 
      })); 
     } 
     }); 
    } 

Вы также хотите код обработчика событий TextChanged, который будет установить логическое значение в ложь, когда они начинают печатать в текстовом поле. Таким образом, вы не добавляете первую запись через 4 секунды после первого события с измененным текстом.

Вторая вещь, о которой нужно знать, заключается в том, что было исключение нарушения, если я использовал AutoCompleteMode.SuggestAppend или Append.

Хотя это не полный ответ, я надеюсь, что это поможет любому, кому удастся найти этот вопрос.

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