We recently had a requirement to programatically create an entry in an existing Sharepoint calendar, so here is an example of how we went about doing this.
I’ll be using Visual Studio 2008 for this, but the process will be similar for any other versions you are using. First of all, you will need to add a reference to one of the Sharepoint web references, so right-click your project and select Add Web Reference. You’ll then be presented with a screen that asks you for a URL for that web service, so go ahead and write it in the following format:
http://nis/_vti_bin/lists.asmx
NOTE: You’ll need to replace the “nis” section with the path to your own Sharepoint website.
The following screen will then be presented displaying the list of available methods:
Change the Web Reference Name to “Sharepoint.Lists” and click the “Add Reference” button to add it to your project.
Next, you’ll need to open up a new form/page/module (whichever is appropriate to your solution), add a few imports:
Imports Sharepoint
Imports System.Text
Imports System.XML
and then we’ll create a function that builds an XML string ready to be passed to the Sharepoint web service:
Public Function CreateCalendarEntry(ByVal CalendarName As String, ByVal Title As String, ByVal Description As String, ByVal AddToDate As DateTime, ByVal FullDay As Boolean, ByVal LengthInMinutes As Double) As XmlNode
' Declarations
Dim sBatch As New StringBuilder
' Get a reference to the list web service
Dim listService As New Lists
listService.Credentials = System.Net.CredentialCache.DefaultCredentials
' Create the XML to be passed to the calendar
sBatch.Append("<Method ID='1' Cmd='New'>")
sBatch.Append("<Field Name='Title'>" & Title & "</Field>")
If FullDay = True Then
sBatch.Append("<Field Name='EventDate'>" & AddToDate.ToString("yyyy-MM-dd") & "</Field>")
sBatch.Append("<Field Name='EndDate'>" & AddToDate.ToString("yyyy-MM-dd") & "</Field>")
sBatch.Append("<Field Name='fAllDayEvent'>1</Field>")
Else
sBatch.Append("<Field Name='EventDate'>" & AddToDate.ToString("yyyy-MM-ddTHH:mm:ssZ") & "</Field>")
sBatch.Append("<Field Name='EndDate'>" & AddToDate.AddMinutes(LengthInMinutes).ToString("yyyy-MM-ddTHH:mm:ssZ") & "</Field>")
sBatch.Append("<Field Name='fAllDayEvent'>0</Field>")
End If
sBatch.Append("<Field Name='Description'>" & Description & "</Field>")
sBatch.Append("</Method>")
' Add the calendar XML to a batch
Dim xmlDoc2 As New System.Xml.XmlDocument()
Dim Batch As System.Xml.XmlElement = xmlDoc2.CreateElement("Batch")
Batch.InnerXml = sBatch.ToString
' Pass the XML to the webservice and return the result
Return listService.UpdateListItems(CalendarName, Batch)
End Function
As you can see from the above, we build an XML string based upon:
The name of the calendar
A title
A description
When it needs to be entered into the calendar (i.e on a certain date, for a full day or a certain amount of hours)
We then pass the XML to the web service which will then insert the calendar entry and return a resulting XML string for you to check it’s success.
So, as an example call to the service, if you pass in some test data:
MyTestPage.CreateCalendarEntry("Development Team Calendar", "LessThanDot.com", "This is a sample calendar entry", System.DateTime.Now, False, 30)
then you should see an example entry in your calendar:
along with some further details once you click into the actual entry: