C# Outlook calendar items einlesen

DeepComputer

Banned
Registriert
Apr. 2020
Beiträge
266
Kann mir bitte jemand helfen wieso dieser Code letzte funktioniert hat und heute nicht mehr?
Wenn ich debugge werden zB einfach Zeilen übersprungen (zB alle Zeilen die nicht oApp enthalten, werden einfach übersprungen), die Variablen haben keinen Wert, ich krieg null reference ex in der foreach condition.

Ich hatte sowas noch nie - hat jemand rat?
Ich will einfach nach einem button click die Termine aus outlook auslesen.

C#:
public async void OnActionCallback(IRibbonControl control, bool isPressed)
        {
            _Outlook.Application oApp = null;
            NameSpace mapiNamespace = null;
            MAPIFolder CalenderFolder = null;
            Items outlookCalenderItems = null;
            oApp = new _Outlook.Application();
            mapiNamespace = oApp.GetNamespace("MAPI");
            CalenderFolder = mapiNamespace.GetDefaultFolder(OlDefaultFolders.olFolderCalendar);
            outlookCalenderItems = CalenderFolder.Items;
            outlookCalenderItems.IncludeRecurrences = true;
            string termineOutput = "";
            foreach (AppointmentItem item in outlookCalenderItems)
            {
                string creationTimeGet = item.CreationTime.ToShortTimeString();
                string endTimeGet = item.End.ToShortTimeString();
                string location = item.Location;
                //string optionalAttendees = item.OptionalAttendees.ToString();
                string s1 = item.RequiredAttendees;
                //string s2 = item.Resources.ToString();
                string s3 = item.Start.ToString();
                string s4 = item.Subject.ToString();
                string s5 = item.UserProperties.ToString();  
                string s6 = item.Body.ToString();
                string s7 = item.ConversationTopic.ToString();

                //item.PrintOut();
                termineOutput += "Deine Termine:\n\ncreationTimeGet: " + creationTimeGet + "\nendTimeGet: " +
                    endTimeGet + "\nlocation: " + location +
                    "\nRecipients: " + s1 +
                    ".\n";
            }
            MessageBox.Show(termineOutput);
}
 
Zuletzt bearbeitet:
Das hab ich jetzt einmal gefixed.
offenbar includiert "session" die ganzen Sachen automatisch.
C#:
            _Outlook.Application oApp = null;
            oApp = new _Outlook.Application();
            var appointments = oApp.Session.GetDefaultFolder(OlDefaultFolders.olFolderCalendar).Items;

Aber jetzt hab ich ein anderes Problem - wie krieg ich das item, welches ich gerade anclicke?
 
Aja, und der debugger hat deshalb verrückt gespielt, weil ich im release mode debugged habe ^^
 
Wo klickst du das denn an? Ist schätze ich mal eine Art Liste. Es wird sicherlich sowas geben wie ein "SelectedItem". Hol dir davon den Index und dann kannst du appointments[Index] nutzen.
 
In welcher Umgebung befindest du dich überhaupt? Irgendwas mit Ribbon jedenfalls. Ich hab bisschen das Gefühl, du solltest dich mit VSTO beschäftigen. Du erzeugst vermutlich jede Menge Outlook Leichen im Task Manager. Du machst dein Outlook nämlich nicht mehr zu.
Und wenn du dich sowieso im Outlook Objektmodell bewegen willst, dann wie gesagt VSTO und ein richtiges AddIn aufbauen. Dann sparst du dir diverse Krämpfe.

Outlook benutzt immer einen aktiven Explorer und benötigt dann voraussichtlich ein Casting. Ich hatte das seinerzeit so im VSTO gebaut. In einem Dialog wird ein manuelles Update des selektierten Items angestoßen.

C#:
private void GetSelectedCommunicationItem()
        {
            if (Globals.ThisAddIn.Application.ActiveExplorer().Selection.Count > 0)
            {
                _communicationItem = CastSelectedCommunicationItem(Globals.ThisAddIn.Application.ActiveExplorer().Selection);
            }
...
           
        }

Checken ob überhaupt was selektiert wurde, dann Casting was der Benutzer denn selektiert hat.
Da es in Outlook in jedem Explorer unterschiedliche Objekttypen geben kann, wird ein gemeinsames Interface entwickelt auf das sich alle runterbrechen lassen. Attachments, Categories, ... es gibt diverse Dinge die jedes Objekt haben kann.
C#:
using MsoOutlook = Microsoft.Office.Interop.Outlook;

private Interfaces.ICommunicationItem CastSelectedCommunicationItem(MsoOutlook.Selection selection)
        {
            if (selection[1] is MsoOutlook.MailItem)
            {
                return new Models.MailItem(selection[1] as MsoOutlook.MailItem);
            }
            else if(selection[1] is MsoOutlook.MeetingItem)
            {
                return new Models.MeetingItem(selection[1] as MsoOutlook.MeetingItem);
            }
            else if(selection[1] is MsoOutlook.PostItem)
            {
                return new Models.PostItem(selection[1] as MsoOutlook.PostItem);
            }
            else
            {
                return null;
            }
        }

PS:
Dein OutlookApp Objekt kannst du so erstellen. Damit checkst du erst ob Outlook schon läuft, wenn nicht, dann mach ein neues. So hab ich aus dem Word AddIn Outlook angesteuert.
C#:
MsoOutlook.Application outlookApp;
try
{
    outlookApp = (MsoOutlook.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Outlook.Application");
}
catch
{
    outlookApp = new MsoOutlook.Application();
}
 
Zuletzt bearbeitet:
Zurück
Oben