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:
- To edit Dates; it allows
only selection of Dates.
- Null Dates
- 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.