上一篇我们了解了vb.net入门――DateTimePicker 控件的使用,在vb.net中还有另外一个用于日期设置的控件――MonthCalendar 控件(日历控件)。
MonthCalendar 控件在vb.net的工具箱中图标如下图一所示:

一、更改 MonthCalendar 控件的外观
MonthCalendar 控件允许我们使用配色、选择显示或隐藏周数和当前日期等多种方法来自定义它的外观。
1、显示周数
在“属性”窗口将 ShowWeekNumbers 属性设置为 true。
或者使用代码设置该属性,如下:
MonthCalendar1.ShowWeekNumbers = True
设置完毕后,周数以单独的列出现在一周的第一天的左边,如下图二所示:

2、在控件底部显示当前日期
将 ShowToday 属性设置为 true 则在控件的底部显示当天日期,设置为False则不显示。同时我们可以通过 TodayDateSet 属性获取 ShowToday 属性显示设置的值
而 ShowTodayCircle 属性用于指示是否在今天的日期上加一个红色的圆圈。
我们在窗体上添加一个 MonthCalendar 控件,两个Button 按钮,然后加入如下代码:
'使用Button1 控件来控制在月历控件底部 显示\不显示 当天日期。
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
MonthCalendar1.ShowToday = Not MonthCalendar1.ShowToday
MessageBox.Show(MonthCalendar1.TodayDateSet.ToString)
End Sub
'使用Button2 控件来控制在是否为当天日期加上红色圆圈。
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
MonthCalendar1.ShowTodayCircle = Not MonthCalendar1.ShowTodayCircle
End Sub
运行程序,分别单击两个按钮,观察设置效果。
我们可以通过 TodayDate 属性表示今天的日期,默认值是当前系统日期,当然我们在必要的时候也可以对它进行重新赋值
3、更改月历的颜色
MonthCalendar 控件提供了 Font、ForoColor、 TitleBackColor、TitleForeColor 和 TrailingForeColor 等属性,用于设置它的外观颜色。
Font 属性和 ForoColor 属性用于确定控件内部文字的字体大小与文字的颜色,也就是月历中每个日期数字的字体与颜色。
TitleBackColor 属性确定日历标题区的背景的颜色,同时它也确定周一到周日的字体颜色。
TitleForeColor 属性确定日历标题区的前景色即标题的颜色。
TrailingForeColor 属性确定所显示的月份之前和之后的日期(即非本月日期)的颜色。
如下代码设置月历的颜色,运行后效果如图三所示:
MonthCalendar1.TitleBackColor = System.Drawing.Color.Blue
MonthCalendar1.TrailingForeColor = System.Drawing.Color.Red
MonthCalendar1.TitleForeColor = System.Drawing.Color.Yellow

4、设置一周中的第一天
默认情况下,一周开始的第一天都是从星期日开始,如图三所示,我们也可以使用 FirstDayOfWeek 属性来改变一周开始的第一天,FirstDayOfWeek 属性默认值为 Default。
这里我们设置一周开始的第一天是星期一,可以在“属性”窗口中设置 FirstDayOfWeek 属性为 Monday,或者在代码中设置,代码如下:
MonthCalendar1.FirstDayOfWeek = Day.Monday
设置后效果如下图四所示:

5、在 MonthCalendar 控件中显示多个月份
MonthCalendar 控件同时可以显示最多十二个月。默认情况下,控件只显示一个月。我们还可以指定显示多少个月以及它们在控件中的排列方式。当更改日历尺寸时,控件大小将调整;因此应确保窗体上有足够的空间供新尺寸使用。
1)、在属性窗口中将 CalendarDimensions 属性设置为要水平和垂直显示的月份数,这里我们设置为水平显示3个,垂直显示2个。
2)、或者在装载的过程中使用以下代码:
MonthCalendar1.CalendarDimensions = New System.Drawing.Size (3,2)
设置效果如下图五所示:

二、在 MonthCalendar 控件中以粗体显示特定日子
MonthCalendar 控件能以粗体显示特殊的日子,可以引起用户对特殊日期(如假日和周末)的注意。
BoldedDates 属性确定要以粗体显示的非周期性日期。
AnnuallyBoldedDates 属性包含每年以粗体显示的日期。
MonthlyBoldedDates 属性包含每月以粗体显示的日期。
这三个属性中的每一个都包含一个 DateTime 对象数组。若要从这些列表中的某一个添加或移除日期,必须添加或移除 DateTime 对象。
1、在属性窗口中设置 DateTime 对象数组
选择要添加特殊日期的属性,然后单击属性后的符号,弹出“DateTime 集合编辑器”窗口,然后使用“添加”或者“移除”按钮来编辑。对于新添加的 DateTime 对象,需要在其右边的“Value”属性中设置其对应的日期。
2、使用代码来实现粗体显示特定日子
在实际编程中,用代码来实现特定日子以粗体显示才能灵活多变地适应用户的需求,下面我们就以一个实例来了解它的使用,首先在windows窗体中拖放一个 MonthCalendar 控件,两个Button 控件,布局如下图六所示:

1)、在窗体Form中创建两个DateTime对象,代码如下:
Dim myVacation1 As Date = New DateTime(2007, 12, 10)
Dim myVacation2 As Date = New DateTime(2007, 12, 17)
注意:这两个变量是窗体级的变量,所以不要包含在任何过程中,放置位置如图七所示:
2)、在“设置日期以粗体显示”按钮的Click事件中添加如下代码:
Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'创建一个 DateTime 对象数组并将其分配给其中某个属性,使一组日期集同时以粗体显示。
Dim VacationDates As DateTime() = {myVacation1, myVacation2}
MonthCalendar1.BoldedDates = VacationDates
MonthCalendar1.UpdateBoldedDates()'调用该方法更新字体的外观
End Sub
当然,我们也可以调用 MonthCalendar 控件的 AddBoldedDate、AddAnnuallyBoldedDate 或 AddMonthlyBoldedDate 方法,使单个日期以粗体显示:
MonthCalendar1.AddBoldedDate(myVacation1)
MonthCalendar1.AddBoldedDate(myVacation2)
3)、在“撤销日期以粗体显示”按钮的Click事件中添加如下代码:
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
MonthCalendar1.RemoveBoldedDate(myVacation1)
MonthCalendar1.RemoveBoldedDate(myVacation2)
MonthCalendar1.UpdateBoldedDates()'调用该方法更新字体的外观
End Sub
以上代码是调用 RemoveBoldedDate、RemoveAnnuallyBoldedDate 或 RemoveMonthlyBoldedDate 方法,使单个加粗显示的日期以常规字体显示。我们也可以调用 RemoveAllBoldedDates、RemoveAllAnnuallyBoldedDates 或 RemoveAllMonthlyBoldedDates 方法,从三个列表中的一个移除所有加粗显示的日期,代码如下:
MonthCalendar1.RemoveAllBoldedDates()
现在运行,分别单击两个按钮,仔细观察,2007-12-10与2007-12-17这两个日期将会被加粗显示,我们可以在代码中使用对应的属性就可以让指定的日期周期性地突出显示。
三、在 MonthCalendar 控件中选择日期范围
我们可以像 DateTimePicker 控件一样式用 MaxDate 属性和 MinDate 属性来分别设置控件允许的最大日期和最小日期。
MonthCalendar 控件的一个主要功能是用户可以选择日期范围,这一点与类似的 DateTimePicker 控件不同,后者只允许选择一个日期/时间值。
我们可以通过设置它的 MaxSelectionCount 属性来影响月历控件中可选择的最多天数。
使用 SelectionRange 属性为月历控件获取或设置选定的日期范围,或者分别使用 SelectionStart 属性(所选日期范围的开始日期)和 SelectionEnd 属性(选定日期范围的结束日期)。下面我们用实例来看怎么运用它。
先如下图八布局窗口:

1、在“选择日期范围”按钮中添加如下代码:
Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim projectStart As Date = New DateTime(2007, 12, 10)
Dim projectEnd As Date = New DateTime(2007, 12, 28)
MonthCalendar1.MaxSelectionCount = 7
MonthCalendar1.SelectionRange = New SelectionRange(projectStart, projectEnd)
End Sub
提示:MonthCalendar1.SelectionRange = New SelectionRange(projectStart, projectEnd)该行也可以替换为分别设置 SelectionStart 和 SelectionEnd 属性,代码如下:
MonthCalendar1.SelectionStart = projectStart
MonthCalendar1.SelectionEnd = projectEnd
2、在“返回选择的日期”按钮中添加如下代码:
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
MessageBox.Show("开始日期:" & MonthCalendar1.SelectionStart.ToString & vbCr & "结束日期:" & MonthCalendar1.SelectionEnd.ToString)
End Sub
现在运行,先单击“选择日期范围”按钮,运行效果如下图九所示:

很明显,并没有选择到我们指定的结束日期2007-12-28,这是因为MaxSelectionCount 属性我们设置为 7,所以最多只能选择7个日期。
再单击“返回选择的日期”按钮,返回结果,也是2007-12-10到2007-12-16。如下图十所示:
