Как я могу показать календарь выбора месяца в своем приложении

Мне интересно показать список из 12 месяцев, как и в элементе управления выбором месяца datepicker. Но мне не нравится показывать средство выбора даты, чтобы показывать даты этого месяца... подходит только просмотр месяца, чтобы я мог выбрать месяц из списка.

мой желаемый результат: введите здесь описание изображения


person KoolKabin    schedule 11.03.2011    source источник


Ответы (4)


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

Это выглядит так (обратите внимание на отсутствие текстового поля и стрелки раскрывающегося списка):

Календарь месяцев


Если вам интересно, есть ли способ ограничить содержимое, отображаемое в элементе управления, только самими месяцами, а не отдельными днями месяца, то нет, это невозможно. Контроллер не предоставляет для этого никаких встроенных средств.

Однако, если вы действительно хотите использовать средство выбора, вы можете ограничить отображаемые им значения только названием месяца. Сделайте это, указав строку пользовательского формата:

myDateTimePicker.Format = DateTimePickerFormat.Custom
myDateTimePicker.CustomFormat = "MMMM"

В результате получается что-то вроде следующего (обратите внимание, что содержимое раскрывающегося списка не изменилось, но информация, записанная в самом элементе выбора, ограничена названием месяца):

DateTimePicker с указанным пользовательским форматом

person Cody Gray    schedule 11.03.2011
comment
извините, я имею в виду, что мне тоже нужен сборщик, но мне нужно, чтобы пользователь выбирал только месяц, а не дату... например, пользователи должны иметь возможность выбирать январь, февраль, а не январь 1, январь 15 - person KoolKabin; 11.03.2011
comment
@KoolKabin: убедитесь, что вы обновили страницу, чтобы увидеть вторую часть моего ответа. Если все, что вам нужно, это пользовательский ввод, я думаю, что это сработает для вас просто отлично. Они смогут увидеть отдельные даты, но не смогут их выбрать (или, по крайней мере, их выбор будет проигнорирован вашим приложением). - person Cody Gray; 11.03.2011
comment
Чтобы избежать отображения раскрывающегося списка и отображать ТОЛЬКО месяц и/или год, вы можете установить значение True для свойства ShowUpDown. - person Andrea Antonangeli; 07.09.2012
comment
Какие значения свойств необходимы для отображения MonthCalender так, как это видно на первом изображении? Я хочу, чтобы календарь отображал только месяцы/год, но я не могу заставить его выглядеть как ваш первый пример изображения. - person GER; 13.08.2015

Это потребует немного pinvoke для отправки сообщений, чтобы календарь переключил представление. Реализуйте обработчик событий DropDown DateTimePicker следующим образом:

    private void dateTimePicker1_DropDown(object sender, EventArgs e) {
        IntPtr cal = SendMessage(dateTimePicker1.Handle, DTM_GETMONTHCAL, IntPtr.Zero, IntPtr.Zero);
        SendMessage(cal, MCM_SETCURRENTVIEW, IntPtr.Zero, (IntPtr)1);
    }

    // pinvoke:
    private const int DTM_GETMONTHCAL = 0x1000 + 8;
    private const int MCM_SETCURRENTVIEW = 0x1000 + 32;

    [System.Runtime.InteropServices.DllImport("user32.dll")]
    private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp);

Переключение видов анимировано, оно будет видно пользователю. Это не будет работать для версий Windows до Vista. При необходимости используйте онлайн-переводчик, чтобы перевести этот код C# на VB.NET.

person Hans Passant    schedule 11.03.2011
comment
Интересно, я даже не знал, что вид может быть установлен таким образом. Но я не думаю, что это помешает пользователю самому изменить вид, когда элемент управления станет видимым. - person Cody Gray; 12.03.2011
comment
@ Коди, нет, просто щелкнув месяц, он переключит представление. Такой щелчок не обнаруживается, только изменение вида. Не уверен, что ОП это понимает. Ну, он не просил об этом. - person Hans Passant; 12.03.2011
comment
@HansPassant Я попробовал это в приложении Windows Forms (C #, Windows 10), предложенный код не ограничивает просмотр календаря только месяцами. Дата видна и выбирается - person Syed Irfan Ahmad; 04.07.2021

Другим способом было бы установить для свойства Format средства выбора даты и времени значение custom, а в свойстве custom format ввести MMMM, чтобы отобразить название месяца. Затем установите для параметра show up значение true, чтобы он обходил раскрывающийся список и позволял пользователю перемещаться вверх и вниз в течение месяцев.

person slister    schedule 27.06.2014

Поместите элемент управления MonthCalendar в GroupBox. Уменьшите GroupBox, чтобы в форме была видна только часть Month элемента управления MonthCalendar. Это скроет дни.

person hoss    schedule 30.01.2014