Автозаполнение, которое ищет символы, которые содержит строка, а не начинается с - PullRequest
1 голос
/ 07 апреля 2011

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

Например, если слова «глобус», «лепесток» и «скольжение» являются сохраненными параметрами, ввод слова «gl» правильно указывает на «глобус» и «скольжение».

Однако,Мне бы хотелось, чтобы при вводе слова «lob» предлагались слова «глобус» и «лепесток». Я не совсем уверен, как к этому подойти.

Кто-нибудь делал это раньше?С VB.NET или C # все в порядке, пока я могу найти правильный .NET способ сделать это.

Ура!=)

Ответы [ 2 ]

2 голосов
/ 12 апреля 2014

Так что я искал что-то вроде этого. TextBox с автозаполнением с поиском Contains вместо StartsWith.

Это представление из этого WinForms | C # | Автозаполнение в середине текстового поля?

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing;

namespace TowInvoicing
{
    //from /1172499/winforms-c-avtozapolnenie-v-seredine-tekstovogo-polya
    public class AutoCompleteTextBox : TextBox
    {
        private ListBox _listBox;
        private bool _isAdded;
        private String[] _values;
        private String _formerValue = String.Empty;

        public AutoCompleteTextBox()
        {
            InitializeComponent();
            ResetListBox();
        }

        private void InitializeComponent()
        {
            _listBox = new ListBox();
            this.KeyDown += this_KeyDown;
            this.KeyUp += this_KeyUp;
        }

        private void ShowListBox()
        {
            if (!_isAdded)
            {
                Parent.Controls.Add(_listBox);
                _listBox.Left = Left;
                _listBox.Top = Top + Height;
                _isAdded = true;
            }
            _listBox.Visible = true;
            _listBox.BringToFront();
        }

        private void ResetListBox()
        {
            _listBox.Visible = false;
        }

        private void this_KeyUp(object sender, KeyEventArgs e)
        {
            UpdateListBox();
        }

        private void this_KeyDown(object sender, KeyEventArgs e)
        {
            switch (e.KeyCode)
            {
                case Keys.Enter:
                case Keys.Tab:
                    {
                        if (_listBox.Visible)
                        {
                            Text = _listBox.SelectedItem.ToString();
                            ResetListBox();
                            _formerValue = Text;
                            this.Select(this.Text.Length, 0);
                            e.Handled = true;
                        }
                        break;
                    }
                case Keys.Down:
                    {
                        if ((_listBox.Visible) && (_listBox.SelectedIndex < _listBox.Items.Count - 1))
                            _listBox.SelectedIndex++;
                        e.Handled = true;
                        break;
                    }
                case Keys.Up:
                    {
                        if ((_listBox.Visible) && (_listBox.SelectedIndex > 0))
                            _listBox.SelectedIndex--;
                        e.Handled = true;
                        break;
                    }


            }
        }

        protected override bool IsInputKey(Keys keyData)
        {
            switch (keyData)
            {
                case Keys.Tab:
                    if (_listBox.Visible)
                        return true;
                    else
                        return false;
                default:
                    return base.IsInputKey(keyData);
            }
        }

        private void UpdateListBox()
        {
            if (Text == _formerValue)
                return;

            _formerValue = this.Text;
            string word = this.Text;

            if (_values != null && word.Length > 0)
            {
                string[] matches = Array.FindAll(_values,
                                                 x => (x.ToLower().Contains(word.ToLower())));
                if (matches.Length > 0)
                {
                    ShowListBox();
                    _listBox.BeginUpdate();
                    _listBox.Items.Clear();
                    Array.ForEach(matches, x => _listBox.Items.Add(x));
                    _listBox.SelectedIndex = 0;
                    _listBox.Height = 0;
                    _listBox.Width = 0;
                    Focus();
                    using (Graphics graphics = _listBox.CreateGraphics())
                    {
                        for (int i = 0; i < _listBox.Items.Count; i++)
                        {
                            if (i < 20)
                                _listBox.Height += _listBox.GetItemHeight(i);
                            // it item width is larger than the current one
                            // set it to the new max item width
                            // GetItemRectangle does not work for me
                            // we add a little extra space by using '_'
                            int itemWidth = (int)graphics.MeasureString(((string)_listBox.Items[i]) + "_", _listBox.Font).Width;
                            _listBox.Width = (_listBox.Width < itemWidth) ? itemWidth : this.Width;;
                        }
                    }
                    _listBox.EndUpdate();
                }
                else
                {
                    ResetListBox();
                }
            }
            else
            {
                ResetListBox();
            }
        }

        public String[] Values
        {
            get
            {
                return _values;
            }
            set
            {
                _values = value;
            }
        }

        public List<String> SelectedValues
        {
            get
            {
                String[] result = Text.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                return new List<String>(result);
            }
        }

    }

}
1 голос
/ 12 апреля 2011

список, в котором вы ищете попробуйте использовать условие, чтобы попасть в список или нет

stringItemInList.IndexOf("txtwhatyousearchfor",StringComparison.OrdinalIgnoreCase) != -1

если вы подключаетесь к базе данных, используйте в своем запросе

parameter LIKE '%txthere%'

Привет

UPDATE

после вашего комментария

Лучший вариант, который я вижу, это создать собственную реализацию IAutoComplete. Вот информация об этом: http://msdn.microsoft.com/en-us/library/bb776292%28VS.85%29.aspx

Также вы можете выполнить поиск некоторых примеров кода людей, создающих свои собственные реализации IAutoComplete.

Привет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...