c# Как получить названия всех месяцев?

Быстрое получение названий всех месяцев

Довольно часто при разработке приложений требуется предоставить пользователю названия всех месяцев, например в виде списка, который содержится внутри элемента управления 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;

comboBox

Данный способ намного удобней и быстрей чем предыдущие способы, но он также имеет несколько «недостатков»:

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;

Читайте также:

3 комментария

  1. Артём says:

    Добрый день.
    Спасибо за наводку к классу DateTimeFormatInfo!
    Немного потыкавшись с ним, по аналогии с месяцами хотелось бы попробовать название дней недели. Но тут есть такой момент. Хотелось бы начать отсчет недели с Понедельника, а не с Воскресенья. Такая строчка:
    DateTimeFormatInfo.CurrentInfo.FirstDayOfWeek = DayOfWeek.Monday;
    дает ошибку что ReadOnly, хотя FirstDayOfWeek и get и set.
    Как быть?

  2. Привет.

    DateTimeFormatInfo.CurrentInfo.FirstDayOfWeek = DayOfWeek.Monday;
    дает ошибку что ReadOnly, хотя FirstDayOfWeek и get и set.

    Возникает исключение, потому что на уровне объекта его нужно изменять, например:

    DateTimeFormatInfo.CurrentInfo.IsReadOnly; //true (только для чтения)
    DateTimeFormatInfo.CurrentInfo.FirstDayOfWeek = DayOfWeek.Monday; //исключение
    DateTimeFormatInfo dtfi = new DateTimeFormatInfo();
    bool isReadOnly = dtfi.IsReadOnly; //false (теперь можно изменить значение свойства)
    dtfi.FirstDayOfWeek = DayOfWeek.Saturday; //OK

    Вообще свойство FirstDayOfWeek (на сколько помню) не влияет на список DayNames.

    Нужно получить список названий в виде массива и уже затем работать с ним.

  3. Артём says:

    Спасибо. Разобрался!

Leave a Reply

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*