Ein häufiger Anwendungsfall für ein Outlook Addin ist das Verarbeiten von Terminen aus dem Kalender. Verwunderlich ist dabei, dass gerade die Start und Endzeiten der Termine Schwierigkeiten bereiten. Die Entscheidung ob das nun ein Bug oder Feature ist überlasse ich jedem selbst. Hat man die folgende Problematik auch erst mal erkannt, lässt sich das “Feature” ;) auch leicht austricksen.
Als Beispiel habe ich eine einfach FormRegion erstellt, die via Adjoining die IPM.Appointment Klasse erweitert. Auf die Form 2 DateTimePicker, einen Button und eine ListBox. Über die DateTimePicker sollen Start-, und EndDaten gewählt werden. Bei Klick auf den Button, sollen dann alle Termin aus dem gewählten Zeitraum in der ListBox dargestellt werden.
Dieser Code wird ausgeführt:
private void btnShowApp_Click(object sender, EventArgs e)
{
//Deklaration
DateTime StartDate;
DateTime EndDate;
Outlook.MAPIFolder Calendar;
Outlook.Items CalendarItems;
Outlook.RecurrencePattern RecPat;
// Gewählte Daten aus DateTimePickern abfragen
StartDate = dtPFrom.Value;
EndDate = dtPTo.Value;
// Kalendar Ordner mit Mapi lesen
Calendar = Globals.ThisAddIn.Application.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderCalendar);
// Elemente Im Kalendar zuweisen
CalendarItems = Calendar.Items;
foreach (Outlook.AppointmentItem Entry in CalendarItems)
{
//Zugehörige Attribute der Appointments abfragen
RecPat = Entry.GetRecurrencePattern();
DateTime AppStart = RecPat.PatternStartDate.AddDays(RecPat.StartTime.ToOADate());
DateTime AppEnd = RecPat.PatternEndDate.AddDays(RecPat.EndTime.ToOADate());
if (AppStart >= StartDate && AppEnd <= EndDate)
{
lstResults.Items.Add(string.Format("{0} bis {1}: {2}", AppStart,AppEnd, Entry.Subject));
}
}
}
Wenn wir dann den Code testen, sehen wir keinen Eintrag in der Listbox auch wenn der Terminkalendar im gewählten Zeitraum gut gefüllt ist.
Zunächst einmal ist wichtig zu Wissen was in den Eigenschaften der RecurrencePattern (RecPat) steht. PatternStartDate und PatternEndDate liefert nur das Datum ohne Uhrzeit. StartTime und EndTime nur die Zeit, so dass in jedem Fall addiert werden muss. (im BeispielCode bereits getan)
Als Beispiel ein Termin am 24.12.2009 von 19:00-20:00 Eingetragen liefert:
StartTime= 30.12.1899 19:00 Ok, nicht weiter verwunderlich, wenn man weiß, dass die Zeitrechnung in .Net intern als Abfolge von Tagen seit dem 31.12.1899 gespeichert wird.
EndTime= 3.01.1601 20:00 Für das Datum habe ich keine Erklärung, aber zumindest die Uhrzeit stimmt
PatternStartDate= 24.12.2009
PatternEndDate = 31.12.4500 23:59 Scheinbar das größtmögliche Datum, auf jeden Fall nicht gesetzt (Das Problem)
Die Lösung:
Zum Glück liefert und das ReccurencePattern Objekt noch eine weiter nützliche Eigenschaft. Duration. Wir Rechnen uns das EndDatum einfach selbst aus, indem wir das Startdatum um die Dauer addieren.
Folgende Zeile vor die Zuweisungen von AppStart und AppEnd eingefügt und schon funktionierts:
RecPat.PatternEndDate = RecPat.PatternStartDate.AddMinutes(RecPat.Duration);