Элемент управления MonthCalendar, отображающий номера недель, не соответствующие стандарту ISO-8601

У меня возникла проблема с элементом управления пользовательского интерфейса формы Windows MonthCalendar. Если свойство ShowWeekNumbers включено, оно показывает, что неделя 1 2016 года — это неделя, содержащая 1 января, то есть пятницу. Это не соответствует стандарту ISO-8601, в котором говорится, что первой неделей года является неделя, содержащая первый четверг года (первая 4-дневная неделя).

Элемент управления MonthCalendar (SysMonthCal32) является частью общей библиотеки элементов управления (comctl32.dll). Он использует стиль MCS_WEEKNUMBERS при отображении номеров недель. На странице «Стили управления месячным календарем» сайта MSDN в описании MSC_WEEKNUMBERS содержится следующее утверждение: «Неделя 1 определяется как первая неделя, содержащая не менее четырех дней». К сожалению, это противоречит тому, что я испытываю с контролем.

Вот фотография элемента управления MonthCalendar, показывающая проблему, описанную выше.


person Esquire Fox    schedule 27.07.2015    source источник


Ответы (2)


Я получил жалобу на неактуальный номер. рабочей недели, которая отображалась при запуске приложения Windows Form.

В частности, проблема возникла из-за того, что 1 и 2 января 2016 года были признаны следующей неделей, в данном случае первой неделей 2016 годасм. приложение, отображающее неправильный номер. недели, то есть 2 вместо 1

Однако в большинстве календарей для таких стран, как Австрия, Германия, Швейцария, первой неделей 2016 года считается неделя, начинающаяся с 4 января.

Быстрое решение этой проблемы состояло в том, чтобы добавить на клиентском ПК 2 в регистр iFirstweekofYear вместо 0 (доступ к этому регистру, запустив regedit->HKEY_CURRENT_USER->Control Panel->International->iFirstWeekOfYear)

Теперь, когда я снова запускаю приложение, отображается правильная неделя года: см. приложение, отображающее правильно нет. недели, то есть 1 вместо 2

Надеюсь, это поможет.

person Alina Buzatu    schedule 14.11.2016

Расчет нумерации недель определяется языковыми настройками пользователя операционной системы. На него нельзя повлиять, изменив свойства CurrentCulture и CurrentUICulture основного потока выполнения. Как указано в этой статье службы поддержки Microsoft:

Это происходит потому, что элемент управления DateTimePicker и элемент управления MonthCalendar являются общими элементами управления Microsoft Windows. Таким образом, локаль пользователя операционной системы определяет пользовательский интерфейс этих элементов управления.

К сожалению, локальные настройки пользователя операционной системы не могут быть установлены во время выполнения приложения. Для достижения соответствия ISO-8601 потребуется настраиваемый элемент управления. Эти элементы управления MonthCalendar и DateTimePicker с учетом региональных параметров в CodeProject должно красиво получиться.

person Esquire Fox    schedule 31.07.2015