Click here to Skip to main content
Click here to Skip to main content

.NET class to create and maintain vCalendar information

, 6 Feb 2003 CPOL
Rate this:
Please Sign up or sign in to vote.
.NET class to create and maintain vCalendar information
<!-- Article image -->

Sample Image - vCalendar.gif

<!-- Add the rest of your HTML here -->

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.

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)

Share

About the Author

slolife
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.. Pinmembermbastianon3-Aug-10 6:08 
GeneralMy vote of 2 PinmvpDave Kreskowiak2-Apr-10 6:53 
GeneralVishal Sanchihar PinmemberPrakshupa16-Sep-09 21:23 
QuestionMark as a private event? Pinmemberneilio24-Aug-09 14:06 
AnswerRe: Mark as a private event? Pinmemberslolife27-Aug-09 10:10 
GeneralRe: Mark as a private event? Pinmembermbielski16-Mar-11 9:20 
GeneralRe: Mark as a private event? Pinmemberslolife9-Jun-11 12:39 
QuestionHTML in vCalendar? PinmemberRicardo Cohen3-Jul-09 8:13 
AnswerRe: HTML in vCalendar? Pinmemberslolife6-Jul-09 10:33 
QuestionCreate an iCal Feed ? PinmemberJenyphur11-Sep-08 13:58 
AnswerRe: Create an iCal Feed ? Pinmemberkmazur1111-Oct-08 20:31 
GeneralAutomatically add to calendar PinmemberDanko Greiner28-Mar-08 5:30 
GeneralNot Working Pinmembersamiji27-Mar-08 1:31 
GeneralRe: Not Working Pinmemberslolife28-Mar-08 13:37 
AnswerRe: Not Working Pinmemberjeremypettit5-May-08 9:22 
GeneralAuto-Updates Pinmemberjustin.moses6-Feb-08 13:08 
GeneralRecurring Events PinmemberMeDeeSa24-Jan-07 11:03 
GeneralRe: Recurring Events Pinmemberkmazur1111-Oct-08 20:30 
GeneralRe: Recurring Events PinmemberMeDeeSa13-Oct-08 12:29 
Generalinseting image in vcalendar PinmemberRajesh Sadashivan9-Nov-06 21:57 
GeneralRe: inseting image in vcalendar PinmemberChris Becker12-Nov-06 5:31 
Generalcalendar time not seeming to work PinmemberStacey Levine11-Aug-06 8:45 
GeneralRe: calendar time not seeming to work PinmemberChris Becker11-Aug-06 10:15 
GeneralExample of how I used the class for Outlook Pinmember-Travis15-Feb-06 4:26 
Generalcalendar PinmemberM.Mary Joancy8-Jan-06 5:09 
sir
I want to know How to prepare eventmanagement calendar form design in vb.net?
GeneralRe: calendar PinmemberChris Becker8-Jan-06 17:56 
Generalcalendar PinmemberM.Mary Joancy8-Jan-06 5:07 
GeneralvCalendar in windows application PinmemberTitan Williams22-Jun-05 22:33 
GeneralNice PinmemberkillerKiwinz2729-May-05 17:11 
QuestionHow do you use it? PinsussIan Powell19-Jan-05 2:33 
AnswerRe: How do you use it? PinsussIan Powell19-Jan-05 4:56 
GeneralRe: How do you use it? PinmemberBossDK18-May-05 2:44 
GeneralRe: How do you use it? PinmemberIan Powell18-May-05 5:13 
QuestionPlease show me on how to use it? Pinmembermcflee8-Nov-04 5:02 
GeneralThe iCalendar PinmemberAnthony_Yio6-Oct-04 21:57 
GeneralRecurring event PinmemberRolfpants3-Sep-04 3:20 
GeneralRe: Recurring event PinmemberChris Becker3-Sep-04 5:43 
GeneralStandards? Hah! PinmemberBrian Lowe11-May-04 3:12 
QuestionHow to create it as email via SMTP Pinsusseric.martin5-Apr-04 13:01 
AnswerRe: How to create it as email via SMTP PinsussChris Becker5-Apr-04 13:18 
GeneralNot working Pinmembermmikey12125-Mar-04 7:17 
GeneralRe: Not working PinsussChris Becker25-Mar-04 7:45 
GeneralRe: Not working Pinmembermmikey12125-Mar-04 8:40 
GeneralRe: Not working PinsussChris Becker25-Mar-04 8:50 
GeneralRe: Not working Pinmembermmikey12125-Mar-04 9:45 
GeneralRe: Not working PinsussChris Becker25-Mar-04 10:17 
GeneralRe: Not working Pinmembermmikey12125-Mar-04 9:52 
GeneralRe: Not working PinsussChris Becker25-Mar-04 10:25 
GeneralRe: Not working Pinmembermmikey12125-Mar-04 10:29 
GeneralRe: Not working PinsussChris Becker25-Mar-04 10:37 

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

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

| Advertise | Privacy | Terms of Use | Mobile
Web01 | 2.8.141030.1 | Last Updated 7 Feb 2003
Article Copyright 2003 by slolife
Everything else Copyright © CodeProject, 1999-2014
Layout: fixed | fluid