I have an application that I am writing that dynamically builds an .ICS file by getting data input by a user. What I am trying to do is save the data to a database then offer the .ICS file for the user to download so they can add it to their calendar. I would like all of this to happen with one button click. The problem I am running into is when the button is clicked it is writing the file so the user is able to download it but it is not storing the data to the database. It stays on the page and doesn't appear to postback.
Public Sub AddToCalendar(ByVal Src As Object, ByVal e As EventArgs)
Try
Dim Subject As String = setDBText(txtSubject.text)
Dim Comment As String = setDBText(txtComment.text)
Dim StartDate As String = setDBDate(txtStartDate.value,txtStartTime.text)
Dim EndDate As String = setDBDate(txtEndDate.value,txtEndTime.text)
sqlStr = "INSERT INTO tblActivity(Subject,Comment,StartDate,EndDate) " & _
"VALUES(" & Subject & "," & Comment & "," & StartDate & "," & EndDate &")"
dc.CommandText = sqlStr
dc.ExecuteNonQuery()
lblTest.Text = "New Event Sucessfully Added"
'************
'** CREATE CODE TO BUILD ICS FILE
'************
Dim sbICSFile As StringBuilder = New StringBuilder()
Dim dtNow As DateTime = DateTime.Now
sbICSFile.AppendLine("BEGIN:VCALENDAR")
sbICSFile.AppendLine("VERSION:2.0")
sbICSFile.AppendLine("PRODID:-//AkonaDev/CalendarAppointment")
sbICSFile.AppendLine("CALSCALE:GREGORIAN")
sbICSFile.AppendLine("BEGIN:VEVENT")
' Define time zones.
' US/Eastern
sbICSFile.AppendLine("BEGIN:VTIMEZONE")
sbICSFile.AppendLine("TZID:US/Eastern")
sbICSFile.AppendLine("BEGIN:STANDARD")
sbICSFile.AppendLine("DTSTART:20071104T020000")
sbICSFile.AppendLine("RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=11")
sbICSFile.AppendLine("TZOFFSETFROM:-0400")
sbICSFile.AppendLine("TZOFFSETTO:-0500")
sbICSFile.AppendLine("TZNAME:EST")
sbICSFile.AppendLine("END:STANDARD")
sbICSFile.AppendLine("BEGIN:DAYLIGHT")
sbICSFile.AppendLine("DTSTART:20070311T020000")
sbICSFile.AppendLine("RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=3")
sbICSFile.AppendLine("TZOFFSETFROM:-0500")
sbICSFile.AppendLine("TZOFFSETTO:-0400")
sbICSFile.AppendLine("TZNAME:EDT")
sbICSFile.AppendLine("END:DAYLIGHT")
sbICSFile.AppendLine("END:VTIMEZONE")
' US/Central
sbICSFile.AppendLine("BEGIN:VTIMEZONE")
sbICSFile.AppendLine("TZID:US/Central")
sbICSFile.AppendLine("BEGIN:STANDARD")
sbICSFile.AppendLine("DTSTART:20071104T020000")
sbICSFile.AppendLine("RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=11")
sbICSFile.AppendLine("TZOFFSETFROM:-0500")
sbICSFile.AppendLine("TZOFFSETTO:-0600")
sbICSFile.AppendLine("TZNAME:CST")
sbICSFile.AppendLine("END:STANDARD")
sbICSFile.AppendLine("BEGIN:DAYLIGHT")
sbICSFile.AppendLine("DTSTART:20070311T020000")
sbICSFile.AppendLine("RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=3")
sbICSFile.AppendLine("TZOFFSETFROM:-0600")
sbICSFile.AppendLine("TZOFFSETTO:-0500")
sbICSFile.AppendLine("TZNAME:CDT")
sbICSFile.AppendLine("END:DAYLIGHT")
sbICSFile.AppendLine("END:VTIMEZONE")
' US/Mountain
sbICSFile.AppendLine("BEGIN:VTIMEZONE")
sbICSFile.AppendLine("TZID:US/Mountain")
sbICSFile.AppendLine("BEGIN:STANDARD")
sbICSFile.AppendLine("DTSTART:20071104T020000")
sbICSFile.AppendLine("RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=11")
sbICSFile.AppendLine("TZOFFSETFROM:-0600")
sbICSFile.AppendLine("TZOFFSETTO:-0700")
sbICSFile.AppendLine("TZNAME:MST")
sbICSFile.AppendLine("END:STANDARD")
sbICSFile.AppendLine("BEGIN:DAYLIGHT")
sbICSFile.AppendLine("DTSTART:20070311T020000")
sbICSFile.AppendLine("RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=3")
sbICSFile.AppendLine("TZOFFSETFROM:-0700")
sbICSFile.AppendLine("TZOFFSETTO:-0600")
sbICSFile.AppendLine("TZNAME:MDT")
sbICSFile.AppendLine("END:DAYLIGHT")
sbICSFile.AppendLine("END:VTIMEZONE")
' US/Pacific
sbICSFile.AppendLine("BEGIN:VTIMEZONE")
sbICSFile.AppendLine("TZID:US/Pacific")
sbICSFile.AppendLine("BEGIN:STANDARD")
sbICSFile.AppendLine("DTSTART:20071104T020000")
sbICSFile.AppendLine("RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=11")
sbICSFile.AppendLine("TZOFFSETFROM:-0700")
sbICSFile.AppendLine("TZOFFSETTO:-0800")
sbICSFile.AppendLine("TZNAME:PST")
sbICSFile.AppendLine("END:STANDARD")
sbICSFile.AppendLine("BEGIN:DAYLIGHT")
sbICSFile.AppendLine("DTSTART:20070311T020000")
sbICSFile.AppendLine("RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=3")
sbICSFile.AppendLine("TZOFFSETFROM:-0800")
sbICSFile.AppendLine("TZOFFSETTO:-0700")
sbICSFile.AppendLine("TZNAME:PDT")
sbICSFile.AppendLine("END:DAYLIGHT")
sbICSFile.AppendLine("END:VTIMEZONE")
' Define the event
sbICSFile.Append("DTSTART;TZID=" + ddlStartTZ.Text + ":")
sbICSFile.Append(CDATE(txtStartDate.value).Year.ToString())
sbICSFile.Append( _
FormatDateTimeValue(CDATE(txtStartDate.value).Month))
sbICSFile.Append( _
FormatDateTimeValue(CDATE(txtStartDate.value).Day) + "T")
sbICSFile.AppendLine(ddlStartTime.SelectedValue)
sbICSFile.Append("DTEND;TZID=" + ddlEndTZ.Text + ":")
sbICSFile.Append(CDATE(txtStartDate.value).Year)
sbICSFile.Append( _
FormatDateTimeValue(CDATE(txtStartDate.value).Month))
sbICSFile.Append( _
FormatDateTimeValue(CDATE(txtStartDate.value).Day) + "T")
sbICSFile.AppendLine(ddlEndTime.SelectedValue)
sbICSFile.AppendLine("SUMMARY:" + txtEventSubject.Text)
sbICSFile.AppendLine("DESCRIPTION:" + txtEventDescription.Text)
sbICSFile.AppendLine("UID:1")
sbICSFile.AppendLine("SEQUENCE:0")
sbICSFile.Append("DTSTAMP:" + dtNow.Year.ToString())
sbICSFile.Append(FormatDateTimeValue(dtNow.Month))
sbICSFile.Append(FormatDateTimeValue(dtNow.Day) + "T")
sbICSFile.Append(FormatDateTimeValue(dtNow.Hour))
sbICSFile.AppendLine(FormatDateTimeValue(dtNow.Minute) + "00")
sbICSFile.AppendLine("END:VEVENT")
sbICSFile.AppendLine("END:VCALENDAR")
Response.ContentType = "text/calendar"
Response.AddHeader("content-disposition", _
"attachment; filename=CalendarEvent1.ics")
Response.Write(sbICSFile)
Response.End()
Catch exc As Exception
lblError.text = exc.toString
End Try
I found that the response can only do one of these things at a time. It cannot send a file and execute the server code. So what I did was create a separate "file download" page that handles the file download on page_load. To get the ICS file data to the file download page I created a session variable that gets filled on the button click of the submission page. Then I added an onClientClick event to the button and set it to a javascript function that opens a pop-up window to the file download page. This allowed the page to save the data to the database and display a file download prompt with a single button click.
Submission Page
ICS File Download Page
HTML
asp:Button ID="btnAddToCalendar" runat="server" OnClick="AddToCalendar" OnClientClick="javascript:DownloadICS();" Text="Add To Calendar" />
JavaScript