Шаг 201.
Microsoft Visual C++ 2010. Язык С/С++.
Компоненты Windows Forms. Компонент MonthCalendar (окончание)

    На этом шаге мы рассмотрим выделение и выбор дат в компоненте.


Содержимое этого шага базируется на:
  1. https://metanit.com/sharp/windowsforms/4.15.php
  2. https://studfile.net/preview/7124448/page:41/

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

    Эта возможность реализуется с помощью трех свойств. Свойство BoldedDates содержит отдельные даты. Свойство AnnuallyBoldedDates включает даты, которые отображаются полужирным шрифтом каждый год. Свойство MonthlyBoldedDates включает даты, которые отображаются полужирным шрифтом каждый месяц. Каждое из этих свойств содержит массив объектов DateTime. Чтобы добавить даты в один из этих списков или удалить их оттуда, необходимо добавить или удалить объект DateTime.

    Добавим выделение нескольких дат:

// Добавить выделение дат
private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
	 monthCalendar1->AddBoldedDate(System::DateTime(2020, 04, 21));
	 monthCalendar1->AddBoldedDate(System::DateTime(2020, 04, 22));
	 monthCalendar1->AddAnnuallyBoldedDate(System::DateTime(2020, 04, 9));
	 monthCalendar1->AddMonthlyBoldedDate(System::DateTime(2020, 04, 1));
	 
	 // Обновить внешний вид шрифта
	 monthCalendar1->UpdateBoldedDates();
 }

    Не забывайте обновить внешний вид шрифта методом UpdateBoldedDates() календаря, иначе обновления шрифта не произойдет.

    Можно выделить полужирным шрифтом сразу несколько дат, создав массив объектов DateTime и присвоив его одному из этих свойств.

// Выделить несколько дат через массив
private: System::Void button6_Click(System::Object^  sender, System::EventArgs^  e) {
	 // Новое веделение автоматически снимет старое
	 System::DateTime t1 = System::DateTime(2020, 04, 20);
	 System::DateTime t2 = System::DateTime(2020, 04, 27);
	 array <System::DateTime>^ dt = {t1, t2};
	 monthCalendar1->BoldedDates = dt;

	 // Обновить внешний вид шрифта
	 monthCalendar1->UpdateBoldedDates();
 }

    Обратите внимание, что новое выделение автоматически отменяет старое.

    Удалите все выделенные полужирным шрифтом даты из одного из трех списков, вызвав метод RemoveAllBoldedDates, RemoveAllAnnuallyBoldedDates или RemoveAllMonthlyBoldedDates:

// Снять выделение жирным шрифтом со всех дат
private: System::Void button7_Click(System::Object^  sender, System::EventArgs^  e) {
	 // Будет снято выделение жирным шрифтом со всех дат
	 monthCalendar1->RemoveAllBoldedDates();
	 // Обновить внешний вид шрифта
	 monthCalendar1->UpdateBoldedDates();
 }

    Можно выделить диапазон дат. Для этого используется свойство SelectionRange, которое содержит диапазон выделенных дат, причем последнее значение выделено не будет.

// Выделить диапазон дат
private: System::Void button5_Click(System::Object^  sender, System::EventArgs^  e) {
	  System::DateTime t1 = System::DateTime(2020, 04, 20);
	  System::DateTime t2 = System::DateTime(2020, 04, 27);
	  monthCalendar1->SelectionRange = 
             gcnew System::Windows::Forms::SelectionRange(t1, t2);
}

    Снять выделение с диапазона можно, указав в качестве его начала и конца одного значения:

// Снять выделение диапазона дат
private: System::Void button8_Click(System::Object^  sender, System::EventArgs^  e) {
	 // Взяли сегодняшнюю дату
	 System::DateTime t = monthCalendar1->TodayDate;
	 // Установили в качестве начала и конца диапазона это значение
	 monthCalendar1->SelectionRange = 
            gcnew System::Windows::Forms::SelectionRange(t, t);
 }

    Наиболее интересными событиями элемента являются события DateChanged и DateSelected, которые возникают при изменении выбранной в элементе даты. Разница между ними заключается в том, что событие DateChanged возникает в том числе, когда происходит щелчок по кнопкам перехода на следующий месяц, в то время как DateSelected возникает только тогда, когда пользователь явно выбирает дату. При этом нужно учитывать, что выбранная дата будет представлять первую дату из диапазона выделенных дат:

// Происходит при изменении даты, выбранной в элементе управления MonthCalendar
// в том числе, когда происходит щелчок по кнопкам перехода на следующий месяц
private: System::Void monthCalendar1_DateChanged(System::Object^  sender, 
    System::Windows::Forms::DateRangeEventArgs^  e) {
	String^ s = "Выбрана дата: " + Convert::ToString(e->Start);
	// Или аналогичный код:
	// String^ s = "Выбрана дата: " + 
             Convert::ToString(monthCalendar1->SelectionStart);
	MessageBox::Show(s);
 }
// Происходит при изменении даты, выбранной в элементе управления MonthCalendar;
// не возникает, когда происходит щелчок по кнопкам перехода на следующий месяц
private: System::Void monthCalendar1_DateSelected(System::Object^  sender, 
    System::Windows::Forms::DateRangeEventArgs^  e) {
	 String^ s = "Выбрана дата: " + 
              Convert::ToString(monthCalendar1->SelectionStart);
	 MessageBox::Show(s);
 }
Архив проекта можно взять здесь.

    Результат работы приведенных обработчиков приведен на рисунке 1:


Рис.1. Результат работы приложения

    На следующем шаге мы рассмотрим компонент NumericUpDown.




Предыдущий шаг Содержание Следующий шаг