Exploiting the MonthCalendar Control with Visual Basic

Monday Aug 11th 2014 by Hannes Du Preez

Hannes du Preez explains all (well, most) of the little secrets of MonthCalendar, a control that enables calendar-like capabilities and that looks like a visual representation of a month.


The MonthCalendar control is actually a little gem hidden away in the deepest closets of many a programmer. Trouble is: How to get the secrets of the inner workings out of them.... As usual, I had to have a look at it myself and try to figure out precisely what can be done with a MonthCalendar control. In today's article, I will explain all (well, most) of the little secrets of this control.


Simply put, the name says it all. It is a control that enables calendar-like capabilities and that looks like a visual representation of a month. You can find all of its Properties and Methods here.

Practical Example

You learn by example. Start a new VB.NET Windows Forms project and add one MonthCalendar control to your form. You can name the objects in your project anything you like, but keep in mind that I stuck with the default names to make it simpler for you to follow.


Let me start with a simple functionality. Add the following code inside your Form's Load event:

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
   'Highlight Important Dates
   Dim dtArrSpecialDates() As Date = New Date() {#7/27/2014#, #8/24/2014#, #10/17/2014#}
   MonthCalendar1.BoldedDates = dtArrSpecialDates
End Sub

With this code, I created an array to host all the important dates I'd like to highlight inside the MonthCalendar control. The first date is my birthday, then my wife's, and finally my daughter's. The next line of code enables the MonthCalendar to make those dates bold, as in Figure 1.

Bolded date
Figure 1: Bolded date

Although having a Bolded date is quite nice and will usually suit your purpose, you can take it a step further. Add this next sub:

Private Sub HighlightDates()  'Draw Borders Around Dates
   Dim gMonthCalendar As Graphics = MonthCalendar1.CreateGraphics()   'Enable Drawing Capabilities
   Dim oHTIMonths As MonthCalendar.HitTestInfo   'Get HitTestInfo
   Dim arrDates As New ArrayList()   'ArrayList For Dates
   For intRows As Integer = 1 To MonthCalendar1.Size.Width - 1   'Loop Through Width ( Rows )
      For intCols As Integer = 1 To MonthCalendar1.Size.Height - 1   'Loop Through Columns
         oHTIMonths = MonthCalendar1.HitTest(intRows, intCols)   'Get Hit Info
         If oHTIMonths.HitArea = MonthCalendar.HitArea.Date Then   'Is It A Date That Was Clicked On?
            If Not arrDates.Contains(oHTIMonths.Time) Then
               gMonthCalendar.DrawRectangle(New Pen(Brushes.Blue, 2), intRows, intCols, 24, 15)   'Draw Rectangle Around
            End If
         End If
      Next intCols
   Next intRows
End Sub

Add a button to your form, and add this code:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
End Sub

This draws a blue rectangle around each day, as shown in Figure 2:

Highlighted Date
Figure 2: Highlighted Date

Add the following line of code inside your Form_Load event:

' Show 4 Rows of 3 Months 
MonthCalendar1.CalendarDimensions = New System.Drawing.Size(4, 3)

This will show all the months, 4 Rows and 3 Columns, as in Figure 3:

4 x 3 Months
Figure 3: 4 x 3 Months

Add the next code:

      ' Hide Today 
      Me.MonthCalendar1.ShowToday = False

      ' Hide Circle Around today's date. 
      Me.MonthCalendar1.ShowTodayCircle = False

This hides the bottom part that shows today's date as well as hides the circle that usually surrounds the current date, as you can see in Figure 4.

Hide Today
Figure 4: Hide Today

Add the next code:

      ' Show Week Numbers 
      Me.MonthCalendar1.ShowWeekNumbers = True

This shows the week numbers to the left of each week, as illustrated in Figure 5.

Show Week Numbers
Figure 5: Show Week Numbers

Add the next event:

   Private Sub MonthCalendar1_DateSelected(ByVal sender As Object, _
           ByVal e As System.Windows.Forms.DateRangeEventArgs) Handles MonthCalendar1.DateSelected

      ' Show selected Date
      MessageBox.Show("Date Selected: " & e.Start.ToShortDateString())

   End Sub

This simply shows the selected date in a MessageBox.

Add the next event:

   Private Sub MonthCalendar1_DateChanged(ByVal sender As Object, _
           ByVal e As System.Windows.Forms.DateRangeEventArgs) Handles MonthCalendar1.DateChanged

      ' Show New Date 
      MessageBox.Show("Date Changed: " & e.Start.ToShortDateString())

   End Sub

This shows the new date you have selected via the DateChanged event.

Add the next lines of code:

      ' Start of Week is Monday 
      MonthCalendar1.FirstDayOfWeek = System.Windows.Forms.Day.Monday

This simply sets Monday as the week's starting point, instead of Sunday.

Add the final piece of code:

      ' Sets the maximum visible date
      MonthCalendar1.MaxDate = New System.DateTime(2014, 12, 31, 0, 0, 0, 0)

      ' Sets the minimum visible date 
      MonthCalendar1.MinDate = New System.DateTime(2013, 1, 1, 0, 0, 0, 0)

This limits the user's ability to select a date range. In the preceding code, I have only allowed selection and displaying of dates for the past two years.


Well, that's it. Obviously, there is much more to the MonthCalendar control, but now at least, you will be able to use it more productively. Until next time, cheers!

Mobile Site | Full Site
Copyright 2017 © QuinStreet Inc. All Rights Reserved