C# MonthCalendar月历控件用法详解(附带实例)
MonthCalendar 可以翻译为月历,图标如下:
我们可以利用这个控件选择日期区间,然后执行更多与日期区间有关的操作,例如使用这个功能设计旅馆或民宿的订阅网站。程序执行时,这个控件直接呈现月历,今天的日期会有外框,可以用鼠标拖曳选择日期区间,如下所示。
例如,可以标记重要人物的生日、公司创立日期、国家庆典等。可以使用 DateTime 集合编辑器标记,也可以使用程序标记。属性窗口 AnnuallyBoldedDates 最右边有图标,单击其可以启动 DateTime 集合编辑器,如下所示。
上述选择后,可以看到未来每年的同一日期都用粗体显示。
如果要在程序设计时标记特别日期,可以使用 AddAnnuallyBoldedDate() 方法,完成标记后要使用 UpdateBoldedDates() 更新日历设定,下列是使用程序设定每年 1 月 1 日是粗体的语句:
【实例 1】设定每年 1 月 1 日、每个月 10 日、1 月 15 日用粗体显示日期。
【实例 2】设定日历可以选取的日期在今天过后第 3~第 10 天的区间中。
从上述执行结果中,读者可以观察到日历只显示可以选取的区间,框起来的是可以选取的第 1 天。
ShowTodayCircle 属性可以设定今天的日期是否加框,默认是 true。
不过这个属性主要用来读取所选的日期区间,具体可以使用下列程序代码:
下列语句读取选取区间的起始日期:
下列语句读取选取区间的结束日期:
【实例 3】设计订房系统,默认今天的日期是入住日期,第2天是退房日期,住房天数是 1 天,当勾选日历日期区间改变时,可以重新显示这 3 个字段。

我们可以利用这个控件选择日期区间,然后执行更多与日期区间有关的操作,例如使用这个功能设计旅馆或民宿的订阅网站。程序执行时,这个控件直接呈现月历,今天的日期会有外框,可以用鼠标拖曳选择日期区间,如下所示。

C# MonthCalendar的粗体属性设定日期
1) AnnuallyBoldedDates属性
MonthCalendar 在显示日期时,除了今天的日期有外框标记,其他日期没有特别标记,这个属性可以让我们特别标记每年的重要日期并用粗体显示。例如,可以标记重要人物的生日、公司创立日期、国家庆典等。可以使用 DateTime 集合编辑器标记,也可以使用程序标记。属性窗口 AnnuallyBoldedDates 最右边有图标,单击其可以启动 DateTime 集合编辑器,如下所示。

上述选择后,可以看到未来每年的同一日期都用粗体显示。
如果要在程序设计时标记特别日期,可以使用 AddAnnuallyBoldedDate() 方法,完成标记后要使用 UpdateBoldedDates() 更新日历设定,下列是使用程序设定每年 1 月 1 日是粗体的语句:
monthCalendar1.AddAnnuallyBoldedDate(new DateTime(2023, 1, 1)); monthCalendar1.UpdateBoldedDates(n); // 更新设定
2) MonthlyBoldedDates属性
这个属性和 AnnuallyBoldedDates 属性类似,不过其用于设定每个月重要日期并用粗体显示。读者可以使用属性窗口的 MonthlyBoldedDates 属性来设定,也可以用程序来设定,下列是使用程序设定每个月 10 日是粗体的语句:monthCalendar1.AddMonthlyBoldedDate(new DateTime(2023, 1, 10)); monthCalendar1.UpdateBoldedDates(n); // 更新设定
3) BoldedDates属性
这个属性和 AnnuallyBoldedDates 属性类似,不过这是应用在设定重要日期以粗体显示。读者可以使用属性窗口的 BoldedDates 属性设定,也可以用程序设定,下列是使用程序设定 2023 年 1 月 15 日用粗体显示的语句:monthCalendar1.AddBoldedDate(new DateTime(2023, 1, 15)); monthCalendar1.UpdateBoldedDates(); // 更新设定
【实例 1】设定每年 1 月 1 日、每个月 10 日、1 月 15 日用粗体显示日期。
namespace ch { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { monthCalendar1.AddAnnuallyBoldedDate(new DateTime(2023, 1, 1)); monthCalendar1.AddMonthlyBoldedDate(new DateTime(2023, 1, 10)); monthCalendar1.AddBoldedDate(new DateTime(2023, 1, 15)); monthCalendar1.UpdateBoldedDates(); } } }下面是两个不同年份的显示结果:

C# MaxDate和MinDate属性
这两个属性可以选取日期区间,例如,设计民宿网站,可以要求消费者订购入住日期必须在从今天算起的 3 天(MinDate)到 90 天(MaxDate)之间,详情可以参考下列程序代码:monthCalendar1.MaxDate = DateTime.Today.AddDays(90); // 最晚日期 monthCalendar1.MinDate = DateTime.Today.AddDays(3); // 最早日期当设定好可以选取日期区间后,日历将只显示这些可以选取的日期。
【实例 2】设定日历可以选取的日期在今天过后第 3~第 10 天的区间中。
namespace ch { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { monthCalendar1.MaxDate = DateTime.Today.AddDays(10); monthCalendar1.MinDate = DateTime.Today.AddDays(3); } } }执行结果为:

从上述执行结果中,读者可以观察到日历只显示可以选取的区间,框起来的是可以选取的第 1 天。
C# ShowToday和ShowTodayCircle属性
从实例 2 的执行结果可以看到日历下方显示今天的日期,这可以用 ShowToday 属性设定。这个属性可以设定是否显示今天日期,默认是 true。ShowTodayCircle 属性可以设定今天的日期是否加框,默认是 true。
C#选取日期相关属性
1) MaxSelectionCount属性
可以设定最多可以选取的天数,默认是 7 天。2) SelectionRange属性
可以设定所选取日期的区间,例如,可以使用下列方式设定选取的区间是 2023 年 1 月 15 日至 2023 年 1 月 31 日:DateTime dateStart = new DateTime(2023, 1, 15); DateTime dateEnd = new DateTime(2023, 1, 31); monthCalendar1.SelectionRange = new SelectionRange(dateStart, dateEnd);
不过这个属性主要用来读取所选的日期区间,具体可以使用下列程序代码:
DateTime dateStart = monthCalendar1.SelectionRange.Start; // 开始日期 DateTime dateEnd = monthCalendar1.SelectionRange.Start; // 结束日期
3) SelectionStart属性
可以设定或读取选取日期区间的起始日期,下列语句设定选取区间的起始日期为今天:monthCalendar1.SelectionStart = DateTime.Today;
下列语句读取选取区间的起始日期:
DateTime dateStart = monthCalendar1.SelectionStart;
4) SelectionEnd属性
可以设定或读取选取日期区间的结束日期,下列语句设定选取区间的结束日期为 10 天后:monthCalendar1.SelectionEnd = DateTime.Today.AddTodays(10);
下列语句读取选取区间的结束日期:
DateTime dateEnd = monthCalendar1.SelectionEnd;
C#日历常用事件
如果日历控件所选日期改变会产生 DateChanged 事件。【实例 3】设计订房系统,默认今天的日期是入住日期,第2天是退房日期,住房天数是 1 天,当勾选日历日期区间改变时,可以重新显示这 3 个字段。
namespace ch { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { monthCalendar1.MaxDate = DateTime.Today.AddDays(90); // 最晚可选取时间 monthCalendar1.MinDate = DateTime.Today; // 最早可选取时间 ShowReservedDate(); } private void ShowReservedDate() { DateTime checkIn = monthCalendar1.SelectionStart; // 住房日期 DateTime checkOut = monthCalendar1.SelectionEnd.AddDays(1); // 退房日期 textCheckIn.Text = checkIn.ToString("yyyy/MM/dd"); // 输出住房日期 textCheckOut.Text = checkOut.ToString("yyyy/MM/dd"); // 输出退房日期 TimeSpan timeSpan = checkOut - checkIn; // 计算天数 textDays.Text = timeSpan.Days.ToString(); // 输出天数 } private void monthCalendar1_DateChanged(object sender, DateRangeEventArgs e) { ShowReservedDate(); } } }下列是选取 6 月 23 日~6 月 26 日为住房时间的结果:
