Click here to Skip to main content
15,867,453 members
Articles / Web Development / ASP.NET
Article

.NET class to create and maintain vCalendar information

Rate me:
Please Sign up or sign in to vote.
4.82/5 (27 votes)
6 Feb 2003CPOL 309.1K   1.6K   105   70
.NET class to create and maintain vCalendar information

Sample Image - vCalendar.gif

Introduction

I have been porting the calendar portion of my site to ASP.NET and came to the exporting of event information to a vCalendar file that can be imported into Outlook or other calendar apps that support the vCalendar/iCalendar format. So I created a class to wrap all of the formatting of information.

VB.NET
Public Class vCalendar
    Public Events As vEvents

    Public Overrides Function ToString() As String
        Dim result As New System.Text.StringBuilder()
        result.AppendFormat("BEGIN:VCALENDAR{0}", _<BR>             System.Environment.NewLine)
        'The following two lines seem to be required by <BR>        'Outlook to get the alarm settings
        result.AppendFormat("VERSION:2.0{0}", System.Environment.NewLine)
        result.AppendFormat("METHOD:PUBLISH{0}", _<BR>             System.Environment.NewLine)
        Dim item As vEvent
        For Each item In Events
            result.Append(item.ToString())
        Next
        result.AppendFormat("END:VCALENDAR{0}", _<BR>            System.Environment.NewLine)
        Return result.ToString
    End Function

    Public Sub New(ByVal Value As vEvent)
        Me.Events = New vEvents()
        Me.Events.Add(Value)
    End Sub

    Public Sub New()
        Me.Events = New vEvents()
    End Sub

    Public Class vAlarm
        Public Trigger As TimeSpan        <BR>           'Amount of time before event to display alarm
        Public Action As String         <BR>           'Action to take to notify user of alarm
        Public Description As String  'Description of the alarm

        Public Sub New()
            Trigger = TimeSpan.FromDays(1)
            Action = "DISPLAY"
            Description = "Reminder"
        End Sub

        Public Sub New(ByVal SetTrigger As TimeSpan)
            Trigger = SetTrigger
            Action = "DISPLAY"
            Description = "Reminder"
        End Sub

        Public Sub New(ByVal SetTrigger As TimeSpan, _<BR>              ByVal SetAction As String, ByVal SetDescription As String)
            Trigger = SetTrigger
            Action = SetAction
            Description = SetDescription
        End Sub

        Public Overrides Function ToString() As String
            Dim result As New System.Text.StringBuilder()
            result.AppendFormat("BEGIN:VALARM{0}", _<BR>               System.Environment.NewLine)
            result.AppendFormat("TRIGGER:P{0}DT{1}H{2}M{3}", _<BR>               Trigger.Days, Trigger.Hours, Trigger.Minutes, _<BR>               System.Environment.NewLine)
            result.AppendFormat("ACTION:{0}{1}", Action, _<BR>               System.Environment.NewLine)
            result.AppendFormat("DESCRIPTION:{0}{1}", _<BR>               Description, System.Environment.NewLine)
            result.AppendFormat("END:VALARM{0}", _<BR>               System.Environment.NewLine)
            Return result.ToString
        End Function
    End Class

    Public Class vEvent
        Public UID As String          'Unique identifier for the event
        Public DTStart As Date  'Start date of event.  <BR>                   'Will be automatically converted to GMT
        Public DTEnd As Date         'End date of event.  <BR>                   'Will be automatically converted to GMT
        Public DTStamp As Date        'Timestamp.  <BR>                   'Will be automatically converted to GMT
        Public Summary As String          'Summary/Subject of event
        Public Organizer As String    'Can be mailto: url or just a name
        Public Location As String
        Public Description As String
        Public URL As String
        Public Alarms As vAlarms        'Alarms needed for this event

        Public Overrides Function ToString() As String
            Dim result As New System.Text.StringBuilder()
            result.AppendFormat("BEGIN:VEVENT{0}", _<BR>               System.Environment.NewLine)
            result.AppendFormat("UID:{0}{1}", UID, _<BR>               System.Environment.NewLine)
            result.AppendFormat("SUMMARY:{0}{1}", _<BR>               Summary, System.Environment.NewLine)
            result.AppendFormat("ORGANIZER:{0}{1}", Organizer, _<BR>               System.Environment.NewLine)
            result.AppendFormat("LOCATION:{0}{1}", Location, _<BR>               System.Environment.NewLine)
            result.AppendFormat("DTSTART:{0}{1}", _<BR>               DTStart.ToUniversalTime.ToString("yyyyMMdd\THHmmss\Z"), _<BR>               System.Environment.NewLine)
            result.AppendFormat("DTEND:{0}{1}", _<BR>               DTEnd.ToUniversalTime.ToString("yyyyMMdd\THHmmss\Z"), _<BR>               System.Environment.NewLine)
            result.AppendFormat("DTSTAMP:{0}{1}", _<BR>               Now.ToUniversalTime.ToString("yyyyMMdd\THHmmss\Z"), _<BR>               System.Environment.NewLine)
            result.AppendFormat("DESCRIPTION:{0}{1}", Description, _<BR>               System.Environment.NewLine)
            If URL.Length > 0 Then result.AppendFormat("URL:{0}{1}", _<BR>               URL, System.Environment.NewLine)
            Dim item As vAlarm
            For Each item In Alarms
                result.Append(item.ToString())
            Next
            result.AppendFormat("END:VEVENT{0}", _<BR>                System.Environment.NewLine)
            Return result.ToString
        End Function

        Public Sub New()
            Me.Alarms = New vAlarms()
        End Sub
    End Class

    Public Class vAlarms
        ' The first thing to do when building a CollectionBase <BR>        ' class is to inherit from System.Collections.CollectionBase
        Inherits System.Collections.CollectionBase

        Public Overloads Function Add(ByVal Value As vAlarm) As vAlarm
            ' After you inherit the CollectionBase class, you <BR>            ' can access an intrinsic object
            ' called InnerList that represents your collection. <BR>            ' InnerList is of type ArrayList.
            Me.InnerList.Add(Value)
            Return Value
        End Function

        Public Overloads Function Item(ByVal Index As Integer) As vAlarm
            ' To retrieve an item from the InnerList, <BR>            ' pass the index of that item to the .Item property.
            Return CType(Me.InnerList.Item(Index), vAlarm)
        End Function

        Public Overloads Sub Remove(ByVal Index As Integer)
            ' This Remove expects an index.
            Dim cust As vAlarm

            cust = CType(Me.InnerList.Item(Index), vAlarm)
            If Not cust Is Nothing Then
                Me.InnerList.Remove(cust)
            End If
        End Sub

    End Class

    Public Class vEvents
        ' The first thing to do when building a CollectionBase <BR>        ' class is to inherit from System.Collections.CollectionBase
        Inherits System.Collections.CollectionBase

        Public Overloads Function Add(ByVal Value As vEvent) As vEvent
            ' After you inherit the CollectionBase class, <BR>            ' you can access an intrinsic object
            ' called InnerList that represents your collection. <BR>            ' InnerList is of type ArrayList.
            Me.InnerList.Add(Value)
            Return Value
        End Function

        Public Overloads Function Item(ByVal Index As Integer) As vEvent
            ' To retrieve an item from the InnerList, <BR>            ' pass the index of that item to the .Item property.
            Return CType(Me.InnerList.Item(Index), vEvent)
        End Function

        Public Overloads Sub Remove(ByVal Index As Integer)
            ' This Remove expects an index.
            Dim cust As vEvent

            cust = CType(Me.InnerList.Item(Index), vEvent)
            If Not cust Is Nothing Then
                Me.InnerList.Remove(cust)
            End If
        End Sub
    End Class
End Class

I plan to add more properties as I discover them, but these are pretty much the only ones that are supported by outlook at this time. I also wanted to get some feedback on my design.

vCalendar specs

Here are some links to for the vCalendar specs (thanks Tommi):

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Web Developer
United States United States
http://www.onlinescorekeeper.com/

Comments and Discussions

 
RantNice work but are missing a couple of things like vAttendee and vAttach.. Pin
mbastianon3-Aug-10 6:08
mbastianon3-Aug-10 6:08 
GeneralMy vote of 2 Pin
Dave Kreskowiak2-Apr-10 6:53
mveDave Kreskowiak2-Apr-10 6:53 
GeneralVishal Sanchihar Pin
Prakshupa16-Sep-09 21:23
Prakshupa16-Sep-09 21:23 
QuestionMark as a private event? Pin
neilio24-Aug-09 14:06
neilio24-Aug-09 14:06 
AnswerRe: Mark as a private event? Pin
slolife27-Aug-09 10:10
slolife27-Aug-09 10:10 
GeneralRe: Mark as a private event? Pin
mbielski16-Mar-11 9:20
mbielski16-Mar-11 9:20 
GeneralRe: Mark as a private event? Pin
slolife9-Jun-11 12:39
slolife9-Jun-11 12:39 
QuestionHTML in vCalendar? Pin
Ricardo Cohen3-Jul-09 8:13
Ricardo Cohen3-Jul-09 8:13 
AnswerRe: HTML in vCalendar? Pin
slolife6-Jul-09 10:33
slolife6-Jul-09 10:33 
I think that the body can contain HTML, but it is up to the client (Outlook in your case) to support it. It doesn't look like Outlook supports HTML in vCalendar/ICS event descriptions. However, once in Outlook, you can add some rich formatting to the description. But if you then try to export the event to ICS, the formatting is dropped.

http://www.onlinescorekeeper.com/

QuestionCreate an iCal Feed ? Pin
Jenyphur11-Sep-08 13:58
Jenyphur11-Sep-08 13:58 
AnswerRe: Create an iCal Feed ? Pin
kmazur1111-Oct-08 20:31
kmazur1111-Oct-08 20:31 
GeneralAutomatically add to calendar Pin
Danko Greiner28-Mar-08 5:30
Danko Greiner28-Mar-08 5:30 
GeneralNot Working Pin
samiji27-Mar-08 1:31
samiji27-Mar-08 1:31 
GeneralRe: Not Working Pin
slolife28-Mar-08 13:37
slolife28-Mar-08 13:37 
AnswerRe: Not Working Pin
jeremypettit5-May-08 9:22
jeremypettit5-May-08 9:22 
GeneralAuto-Updates Pin
Justincc6-Feb-08 13:08
professionalJustincc6-Feb-08 13:08 
GeneralRecurring Events Pin
MeDeeSa24-Jan-07 11:03
MeDeeSa24-Jan-07 11:03 
GeneralRe: Recurring Events Pin
kmazur1111-Oct-08 20:30
kmazur1111-Oct-08 20:30 
GeneralRe: Recurring Events Pin
MeDeeSa13-Oct-08 12:29
MeDeeSa13-Oct-08 12:29 
Generalinseting image in vcalendar Pin
Rajesh Sadashivan9-Nov-06 21:57
Rajesh Sadashivan9-Nov-06 21:57 
GeneralRe: inseting image in vcalendar Pin
slolife12-Nov-06 5:31
slolife12-Nov-06 5:31 
Generalcalendar time not seeming to work Pin
Stacey Levine11-Aug-06 8:45
Stacey Levine11-Aug-06 8:45 
GeneralRe: calendar time not seeming to work Pin
slolife11-Aug-06 10:15
slolife11-Aug-06 10:15 
GeneralExample of how I used the class for Outlook Pin
Travis Rennemann15-Feb-06 4:26
Travis Rennemann15-Feb-06 4:26 
Generalcalendar Pin
M.Mary Joancy8-Jan-06 5:09
M.Mary Joancy8-Jan-06 5:09 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.