ARTICLE

Custom Calendar Control in VB.NET

Posted by Susan Abraham Articles | Visual Basic 2010 May 19, 2005
The Custom Calendar Control described in this paper overcomes the above limitations of the DateTimePicker by enhancing the capabilities of the existing MonthCalendar Control provided by Visual Studio .Net.
Download Files:
 
Reader Level:

Introduction

Visual Studio 2003 ships in with DateTimePicker Control for selecting Date. But the DateTimePicker inherently has it own limitations. It does not allow the following:

  1. To edit Dates; it allows only selection of Dates.
  2. Null Dates
  3. Set a collection of Dates to be bolded.

The Custom Calendar Control described in this paper overcomes the above limitations of the DateTimePicker by enhancing the capabilities of the existing MonthCalendar Control provided by Visual Studio .Net.

The Solution

Visual Studio 2003 ships in with a Month Calendar Control which allows Dates to be bolded. We can enhance the Month Calendar by coupling it with a TextBox and a Button Control and overcome the limitations of the DateTimePicker Control.

Implementation

For enhancing the capabilities of the DateTimePicker Control, the following steps are required to be implemented:

Step 1:

Create a custom project of type Windows Control Library. Within the library add a new file of type Custom Control. We are in effect creating a new control altogether using the Textbox, Button and MonthCalendar Control

Step 2:

To the Custom Control add a TextBox and a Button Control name the textBoxDate and buttonDate respectively. Name the new Control as Calendar Control.

The general look and feel of the custom Calendar is as follows:


Step 3:

The functionality to be implemented requires controlling the visibility of the MonthCalendar Control depending on the clicking of the buttonDate Control. Once the Date is selected, the Month Calendar control should become invisible by default.

Also to support nullable dates, the textbox controls text is used to support blank values.

Declare the following variables in the Custom Control:
 
#Region
"Variables"
' dateValue would contain the selected Date
Private dateValue As
String
' acceptOnlyBoldedDates would contain the selected Date
Private acceptOnlyBoldedDates As
Boolean
#End Region


The dateValue string would contain the selectedDate in string format, which allows Null Dates as well.

The acceptOnlyBoldedDates is a property that is exposed to the user of the Control. Setting this property to true would enable the validation check that the selected Date falls in one of the bolded Dates already set by the user programmatically.

If the acceptOnlyBoldedDates is set to false, any valid date that the user enters would be selected. When set to true, the date entered would necessarily should be one previously set bolded dates.

Step 4:

For setting the bolded Dates, the following function is exposed. The user can programmatically use the SetAnnuallyBoldedDates to set a list of Bolded Dates.
'<summary>
' public method exposed to set the annuallyboldedDates
</summary>
' <param name="sender"></param>
' <param name="e"></param>
Public Sub SetAnnuallyBoldedDates(ByVal dates As DateTime())Me
.monthCalendarDate.AnnuallyBoldedDates = dates
End
Sub

Step 5:

Declare the following event handlers in the Custom Calendar Class:
' <summary>''' Occurs when the Date of the Calendar changes
' </summary>
' <param name="sender"></param>
' <param name="e"></param>
Private Sub monthCalendarDate_DateChanged(ByVal sender As Object, ByVal e As
System.Windows.Forms.DateRangeEventArgs)
If Me.acceptOnlyBoldedDates = False
Then
Me
.dateValue = Me.monthCalendarDate.SelectionStart.ToShortDateString()Me.textBoxDate.Text = Me
.dateValue
Me.monthCalendarDate.Visible =
False
Else
Dim
setDateTime As Boolean =
False
Dim
selectedDateTime As DateTime= Me
.monthCalendarDate.SelectionStart
For Each dt As DateTime In Me
.monthCalendarDate.AnnuallyBoldedDates
If (dt.Date.Day = selectedDateTime.Date.Day) AndAlso (dt.Date.Month = selectedDateTime.Date.Month)
Then
Me
.dateValue = Me.monthCalendarDate.SelectionStart.ToShortDateString()

Me
.textBoxDate.Text = Me.dateValue
Me.monthCalendarDate.Visible =
False
setDateTime =
True
Exit
For
End
If
Next
dt
If (Not setDateTime)
Then
Me
.dateValue = ""
Me.textBoxDate.Text = Me
.dateValue
Me.monthCalendarDate.Visible =
False
End
If
End
If
End
Sub
' <summary>
' Occurs when the KeyUp Event of the TextBoxDate occurs
' </summary>
' <param name="sender"></param>
' <param name="e"></param>

Private Sub textBoxDate_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs)
If e.KeyCode = Keys.Delete
Then
Me
.dateValue = ""
End
If
End
Sub
' <summary>
' Occurs on click event of the buttonDate Control''' </summary>
' <param name="sender"></param>
' <param name="e"></param>
Private Sub buttonDate_Click(ByVal sender As Object, ByVal e As System.EventArgs)Me.monthCalendarDate.Visible =
True
End
Sub
' <summary>
' Occurs on Calendar Load event
' </summary>
' <param name="sender"></param>
' <param name="e"></param>
Private Sub Calendar_Load(ByVal sender As Object, ByVal e As System.EventArgs)Me.monthCalendarDate.Visible =
False
End
Sub
' <summary>
' Occurs on TextBox Leave Event
' </summary>''' <param name="sender"></param>
' <param name="e"></param>
Private Sub textBoxDate_Leave(ByVal sender As Object, ByVal e As System.EventArgs)
Try
Dim
dt As DateTime = Convert.ToDateTime(Me
.textBoxDate.Text)
Catch ex As
Exception
Me
.dateValue = ""
Me
.textBoxDate.Text = ""
End
Try
End
Sub
' <summary>
' public method exposed to set the annuallyboldedDates
' </summary>
' <param name="sender"></param>
' <param name="e"></param>
Public Sub SetAnnuallyBoldedDates(ByVal dates As DateTime())Me
.monthCalendarDate.AnnuallyBoldedDates = dates
End
Sub

Step 6:

Add to Solution a Test Project. Add a reference to the Calendar Library Project in the References section. Rename the form appropriately and drag and drop the Control from the Toolbox on the Form. On the load event of the Form set the bolded dates as follows:

Me.calendar.SetAnnuallyBoldedDates(New System.DateTime() { New System.DateTime(2005, 4, 20, 0, 0, 0, 0), New System.DateTime(2005, 4, 28, 0, 0, 0, 0), New System.DateTime(2005, 5, 5, 0, 0, 0, 0), New System.DateTime(2005, 7, 4, 0, 0, 0, 0), New System.DateTime(2005, 12, 15, 0, 0, 0, 0), New System.DateTime(2005, 12, 18, 0, 0, 0, 0)})

In the Design View set the acceptOnlyBoldedDates property of the Calendar Control to true.

Step 7:

Set the Test Project as the startup project and execute the project. Since the acceptOnlyBoldedDates property was set to true, the control accepts only Dates that are in the Bolded Date Collection.

Conclusion

Thus we have successfully created a Control that has all the capabilities of the existing DateTimePicker enhanced along with additional capabilities imparted from that of MonthCalendar Control.

Login to add your contents and source code to this article
Article Extensions
Contents added by Akshara Dave on May 12, 2009
How to include it in the main project??
I.E how to add reference in the main project's particular page?

i tried this out but only its .dll file is getting include not the main component...
share this article :
post comment
 

I am a fresher of vb.net.... i want to build new gridview with datetime picker control...... I ve been trying last 2 weeks with above code........still i didnt get solution......please any one help me....very urgent.......my time is over...

Posted by sree karthik May 21, 2012

please help me, how can i create a calendar using a button?, because i want every date to be selected for the event or activities of the selected date to be show in another FORM. thaks!.....:)

Posted by Raymark Urita May 12, 2011

Here is a complete tutorial:

DateTimePicker Control in VB.NET

Posted by Mahesh Chand Aug 25, 2010

0 / 20 because I can'y give you less

Posted by Hichem Dec 25, 2009

i am not see in this codding when i see .............

Posted by dada peer Sep 17, 2009
Team Foundation Server Hosting
Become a Sponsor
PREMIUM SPONSORS
  • ceTE software specializes in components for dynamic PDF generation and manipulation. The DynamicPDF™ product line allows you to dynamically generate PDF documents, merge PDF documents and new content to existing PDF documents from within your applications. Visit DynamicPDF here
    The leading .NET charting control now features PDF, Flash and Silverlight export, visualization of large datasets and more. Deliver true charting functionality to your BI, Scorecard, Presentation or Scientific apps. Download evaluation now.
Nevron Diagram
Become a Sponsor