Быстрое получение названий всех месяцев
Довольно часто при разработке приложений требуется предоставить пользователю названия всех месяцев, например в виде списка, который содержится внутри элемента управления ComboBox.
Для создания и заполнения такого списка используют разные способы, например:
//1. string [] monthNames = {"Январь", "Февраль", ...}; comboBox1.DataSource = monthNames; //2. comboBox1.Items.AddRange(new string[] { "Январь", "Февраль", ...});
Как видно, чаще всего, всё сводятся к созданию массива и его последующей привязки к элементу управления.
Недостатками данного способа являются: во-первых, время, которое приходится каждый раз тратить на ручное создание и заполнение массива, а во-вторых, возникает вероятность допустить ошибку, например при вводе названия месяца.
Избежать подобных проблем и при этом ускорить процесс создания списка можно с помощью класса DateTimeFormatInfo, который содержится внутри пространства имён System.Globalization. Данный класс содержит свойство MonthNames, с помощью которого можно быстро получить названия всех месяцев в виде массива, например:
//добавить using System.Globalization; //1. string [] monthNames = DateTimeFormatInfo.CurrentInfo.MonthNames; comboBox1.DataSource = monthNames; //2. comboBox1.DataSource = DateTimeFormatInfo.CurrentInfo.MonthNames; //3. comboBox1.Items.AddRange(DateTimeFormatInfo.CurrentInfo.MonthNames);
Также с помощью данного класса можно быстро получить и аббревиатуры (сокращенные названия месяцев), используя свойство AbbreviatedMonthNames, например:
comboBox1.DataSource = DateTimeFormatInfo.CurrentInfo.AbbreviatedMonthNames;
Данный способ намного удобней и быстрей чем предыдущие способы, но он также имеет несколько «недостатков»:
1. Свойство MonthNames всегда возвращает массив, последним элементом которого является пустая строка, исключить которую можно, например следующим образом:
comboBox1.DataSource = DateTimeFormatInfo.CurrentInfo.MonthNames.Take(12).ToArray();
2. С помощью свойства CurrentInfo мы получаем значения, используя текущие региональные настройки, которые могут отличаться. Поэтому не плохо подстраховаться и задать их вручную, перед тем как получить названия месяцев, например:
using System.Globalization; CultureInfo culInf = new CultureInfo("ru-RU"); System.Threading.Thread.CurrentThread.CurrentCulture = culInf; System.Threading.Thread.CurrentThread.CurrentUICulture = culInf; comboBox1.DataSource = DateTimeFormatInfo.CurrentInfo.MonthNames;
Читайте также:
Добрый день.
Спасибо за наводку к классу DateTimeFormatInfo!
Немного потыкавшись с ним, по аналогии с месяцами хотелось бы попробовать название дней недели. Но тут есть такой момент. Хотелось бы начать отсчет недели с Понедельника, а не с Воскресенья. Такая строчка:
DateTimeFormatInfo.CurrentInfo.FirstDayOfWeek = DayOfWeek.Monday;
дает ошибку что ReadOnly, хотя FirstDayOfWeek и get и set.
Как быть?
Привет.
DateTimeFormatInfo.CurrentInfo.FirstDayOfWeek = DayOfWeek.Monday;
дает ошибку что ReadOnly, хотя FirstDayOfWeek и get и set.
Возникает исключение, потому что на уровне объекта его нужно изменять, например:
Вообще свойство FirstDayOfWeek (на сколько помню) не влияет на список DayNames.
Нужно получить список названий в виде массива и уже затем работать с ним.
Спасибо. Разобрался!