C# Функция автозавершения для textbox

BKeaton

Green Team
18.07.2018
204
339
BIT
153
Автозавершение при вводе данных в textbox
В этой небольшой статье хочу показать на простом примере, как добавить возможность автозавершения при вводе данных в элемент управления textbox.

Создадим новый проект типа Windows Forms Application на языке c#.

Добавим на форму два элемента управления: Button (кнопка) и TextBox (текстовое поле).

atributy-xml-fajla_13.png


Для реализации автоматического завершения выполним следующие действия:

1. Установим свойство MultiLine, элемента управления textBox, в значение false.

2. Создадим новый метод CreateAutoCompleteList.

C#:
private void CreateAutoCompleteList()
{
}
3. Создадим список слов для автозавершения.

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

Структура xml файла приведена на картинке.

atributy-xml-fajla_2.png


4. С помощью свойства AutoCompleteMode выберем режим автоподстановки:

Append — первое найденное (совпавшее) значение в коллекции AutoCompleteStringCollection.

c-funkcija-avtozavershenija-dlja-textbox_1.gif


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

c-funkcija-avtozavershenija-dlja-textbox_2.gif


SuggestAppend — позволяет использовать оба выше описанных режима.

Поиск совпадений в коллекции производится по первому символу слова введенного в текстовое поле.

5. С помощью свойств AutoCompleteSource и AutoCompleteCustomSource укажем источник, в котором нужно искать слова для автоматического завершения.

При работе со встроенным источником типа AutoCompleteStringCollection выбираем значение CustomSource перечисления AutoCompleteSource.

C#:
AutoCompleteSource.CustomSource;
В результате получаем:

C#:
private void CreateAutoCompleteList()
{
try
{
//загрузка xml файла
XDocument xDoc = XDocument.Load(@"../../names.xml");
//получаем все элементы name
var elmsName = xDoc.Descendants("name");
//коллекция для хранения строк для автозавершения
AutoCompleteStringCollection list;
list = new AutoCompleteStringCollection();
//заполняем коллекцию
foreach (var elmName in elmsName)
{
list.Add(elmName.Value);
}
//выбираем режим автозавершения
textBox1.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
//указываем источник данных для автоподстановки
textBox1.AutoCompleteSource = AutoCompleteSource.CustomSource;
textBox1.AutoCompleteCustomSource = list;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
Для работы с классом XDocument необходимо добавить ссылку на пространство имён System.Xml.Linq.

C#:
using System.Xml.Linq;
Созданный метод будет выполняться во время загрузки формы, поэтому для начала подписываемся на событие Form_Load, а затем в обработчике данного события вызываем метод CreateAutoCompleteList:

C#:
private void Form1_Load(object sender, EventArgs e)
{
CreateAutoCompleteList();
}
Читайте также:

 
Последнее редактирование:
  • Нравится
Реакции: Vertigo
M

MonteShot

Почему бы не использовать атрибуты? Работает быстрее и потокобезопасно.
 
  • Нравится
Реакции: Vertigo
M

MonteShot

Ссылок не найду, но вот, то что я делал на Xamarin. В модели писал нужные атрибуты

C#:
[Serializable]

    [XmlRoot(ElementName = "weatherdata")]
    public class WeatherModel
    {

        [XmlElement(ElementName = "location")]
        public WeatherLocation Location { get; set; }
        [XmlElement(ElementName = "meta")]
        public WeatherMeta Meta { get; set; }
        [XmlElement(ElementName = "forecast")]
        public Forecast Forecast { get; set; }

    }

    public class WeatherLocation
    {
        [XmlElement(ElementName = "name")]
        public string City { get; set; }
        [XmlElement(ElementName = "type")]
        public string Type { get; set; }
        [XmlElement(ElementName = "Country")]
        public string Country { get; set; }
        [XmlElement(ElementName = "timezone")]
        public string Timezone { get; set; }
        [XmlElement(ElementName = "location")]
        public LocationContent Location { get; set; }

    }
    public class LocationContent
    {
        [XmlAttribute(AttributeName = "altitude")]
        public string Altitude { get; set; }
        [XmlAttribute(AttributeName = "latitude")]
        public string Latitude { get; set; }
        [XmlAttribute(AttributeName = "longtitude")]
        public string Longtitude { get; set; }
        [XmlAttribute(AttributeName = "geobase")]
        public string Geobase { get; set; }
        [XmlAttribute( AttributeName = "geobaseid")]
        public string GeobaseID { get; set; }
    }
    public class WeatherMeta
    {
        [XmlElement(ElementName = "calctime")]
        public string Calctime { get; set; }
        public Sun Sun { get; set; }
    }

    public class Sun
    {
        [XmlElement(ElementName = "rise")]
        public string Sunrise { get; set; }
        [XmlElement(ElementName = "set")]
        public string Sunset { get; set; }
    }

    public class Forecast
    {
        [XmlElement(ElementName = "time")]
        public List<Weather> Time { get; set; }
    }
    public class Weather
    {
        [XmlAttribute(AttributeName = "from")]
        public string TimeFrom { get; set; }
        [XmlAttribute(AttributeName  = "to")]
        public string TimeTo { get; set; }
        [XmlElement(ElementName = "symbol")]
        public Symbol Symbol { get; set; }
        [XmlElement(ElementName = "precipitation")]
        public Precipitation Precipitation { get; set; }
        [XmlElement(ElementName = "windDirection")]
        public WindDirection WindDirection { get; set; }
        [XmlElement(ElementName = "windSpeed")]
        public WindSpeed WindSpeed { get; set; }
        [XmlElement(ElementName = "temperature")]
        public Temperature Temperature { get; set; }
        [XmlElement(ElementName = "pressure")]
        public Pressure Pressure { get; set; }
        [XmlElement(ElementName = "humidity")]
        public Humidity Humidity { get; set; }
        [XmlElement(ElementName = "clouds")]
        public Clouds Clouds { get; set; }

    }

    public class Clouds
    {
        [XmlAttribute(AttributeName = "unit")]
        public string Unit { get; set; }
        [XmlAttribute(AttributeName = "all")]
        public string All { get; set; }
        [XmlAttribute(AttributeName = "value")]
        public string Value { get; set; }
    }

    public class Humidity
    {
        [XmlAttribute(AttributeName = "unit")]
        public string Unit { get; set; }
        [XmlAttribute(AttributeName = "value")]
        public string Value { get; set; }
    }

    public class Pressure
    {
        [XmlAttribute(AttributeName = "unit")]
        public string Unit { get; set; }
        [XmlAttribute(AttributeName = "value")]
        public string Value { get; set; }
    }

    public class Temperature
    {
        [XmlAttribute(AttributeName  = "unit")]
        public string Unit { get; set; }
        [XmlAttribute(AttributeName = "value")]
        public string Value { get; set; }
        [XmlAttribute(AttributeName = "min")]
        public string MinTemp { get; set; }
        [XmlAttribute(AttributeName = "max")]
        public string MaxTemp { get; set; }
    }

    public class WindSpeed
    {
        [XmlAttribute(AttributeName = "mps")]
        public string Mps { get; set; }
        [XmlAttribute(AttributeName = "name")]
        public string Name { get; set; }
    }

    public class WindDirection
    {
        [XmlAttribute(AttributeName = "deg")]
        public string Deg { get; set; }
        [XmlAttribute(AttributeName = "code")]
        public string Code { get; set; }
        [XmlAttribute(AttributeName = "name")]
        public string Name { get; set; }
    }

    public class Precipitation
    {
        [XmlAttribute(AttributeName = "value")]
        public string PrecipitationValue { get; set; }
        [XmlAttribute(AttributeName = "type")]
        public string PrecipitationType { get; set; }
    }

    public class Symbol
    {
        [XmlAttribute(AttributeName = "name")]
        public string WeatherCond { get; set; }
    }

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

C#:
 LoadItemsCommand = new Command(async () => await ExecuteLoadWeatherCommand());
                Temperature = "-273°C";

//например:
       Task t = ExecuteLoadWeatherCommand();
Сама функция:
C#:
 async Task ExecuteLoadWeatherCommand()
            {
                if (IsBusy)
                    return;

                IsBusy = true;

                try
                {

                    var items = await WeatherStore.LoadDetailItemData(); //inf loading
                    string[] _Temperature = items.Forecast.Time[0].Temperature.Value.Split(new char[] { '.' });
                    this.Temperature = $"{_Temperature[0]}°C";
                    if (items.Forecast.Time[0].Clouds.Value != items.Forecast.Time[0].Symbol.WeatherCond)
                    {
                        this.CityName =
                            $"Сейчас в Шостке {items.Forecast.Time[0].Clouds.Value} и {items.Forecast.Time[0].Symbol.WeatherCond}";
                    }
                    else
                    {
                        this.CityName =
                            $"Сейчас в Шостке {items.Forecast.Time[0].Clouds.Value}";

                    }

                    OnPropertyChanged("");
                }
                catch (Exception ex)
                {
                    this.CityName = $"Невозможно обновить прогноз";
                }
                finally
                {
                    IsBusy = false;

                }
            }

Парсинг погоды в одном из проектов.
 
  • Нравится
Реакции: Vertigo
M

MonteShot

Это быстрее чем перебирать всю коллекцию. А также если в будущем, если XML поменяется, то все,как по мне, более логично меняется.

Необязательно весь xml описывать. Достаточно нужные атрибуты.
Еще плюс такого способа, то не нужно писать для JSON отдельного метода обработки данных. Достаточно описать модель и в коде ничего менять не нужно.
 
  • Нравится
Реакции: Vertigo
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!