[C#] Автоматическая подстановка вариантов в TextBox

Неожиданно понадобилось, чтобы 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 или нажмите здесь чтобы информировать меня. Спасибо.

Добавить комментарий