Неожиданно понадобилось, чтобы TextBox автоматически предлагал варианты ввода пользователю. В моей случае это должен быть элемент, который сможет принимать любой набор данных. Можно конечно поколдовать с ComboBox но этот вариант показался мне слишком скучным. Пару лет назад я кстати уже реализовал такой вариант, но теперь он мне кажется слишком громоздким, найденное решение значительно интереснее.
Идея понятна, много продуктов где есть объекты с похожим поведением, к примеру, поиск Google. Для тестового примера я решил не заморачиваться и список данных лежит в простом списке List<>, желающие смогут доделать эту реализацию для своих нужд я думаю без проблем. Логично что использовать List<> для реального продукта не имеет смысла.
В примере рассмотре пример в котором пользователь начинает вводить «Т» и получает список вариантов, по мере ввода список вариантов изменяется.
class AutoSuggestControl : TextBox { List<string> Suggestions; int PreviousLength; // Используем простой сортированный list для предоставления вариантов. public AutoSuggestControl() : base() { Suggestions = new List<string>(); // Мы сохраняем предыдущие значение длинны строки PreviousLength = 0; // Заполняем несколько вариантов для различных ситуаций Suggestions.Add("Тюмень"); Suggestions.Add("Тюменская область"); Suggestions.Add("Тюменский район"); Suggestions.Sort(); } /// <summary> /// Search through the collection of suggestions for a match /// </summary> /// <param name="Input"></param> /// <returns></returns> private string FindSuggestion(string Input) { if (Input != "") foreach (string Suggestion in Suggestions) { if (Suggestion.StartsWith(Input)) return Suggestion; } return null; } /// <summary> /// We only interfere after receiving the OnTextChanged event. /// </summary> /// <param name="e"></param> protected override void OnTextChanged(EventArgs e) { base.OnTextChanged(e); // We don't do anything if the user is trying to shorten the sentence int CursorPosition = SelectionStart; if (Text.Length > PreviousLength && CursorPosition >= 0) { string Suggestion = FindSuggestion(Text.Substring(0, CursorPosition)); if (Suggestion != null) { // Set the contents of the textbox to the suggestion Text = Suggestion; // Setting text puts the cursor at the beginning of the textbox, so we need to reposition it Select(CursorPosition, 0); } } PreviousLength = Text.Length; } }
Все довольно просто и быстро.
Если Вы нашли ошибку, пожалуйcта выделите ее и нажмите Shift + E или нажмите здесь чтобы информировать меня. Спасибо.