Search code examples
c#outlookvstooutlook-addinoffice-addins

How to iterate through the objects in an Outlook Selection without assuming they are all MailItems?


I have a problem while iterating over Outlook MailItems in and OutlookSelection. I realise that the error is probably caused by a meeting invitation or some other type if Outlook item. I know I could look over objects in a Folder and test to see if each one is a MailItem but I cannot do that as the task has to process a Selection. Is there a way to iterate through the objects in an Outlook selection?


Solution

  • You can check out the item type at runtime:

    Outlook.Explorer currentExplorer = null;
    
    private void ThisAddIn_Startup
        (object sender, System.EventArgs e)
    {
        currentExplorer = this.Application.ActiveExplorer();
        currentExplorer.SelectionChange += new Outlook
            .ExplorerEvents_10_SelectionChangeEventHandler
            (CurrentExplorer_Event);
    }
    
    private void CurrentExplorer_Event()
    {
        Outlook.MAPIFolder selectedFolder =
            this.Application.ActiveExplorer().CurrentFolder;
        String expMessage = "Your current folder is "
            + selectedFolder.Name + ".\n";
        String itemMessage = "Item is unknown.";
        try
        {
            if (this.Application.ActiveExplorer().Selection.Count > 0)
            {
                Object selObject = this.Application.ActiveExplorer().Selection[1];
                if (selObject is Outlook.MailItem)
                {
                    Outlook.MailItem mailItem =
                        (selObject as Outlook.MailItem);
                    itemMessage = "The item is an e-mail message." +
                        " The subject is " + mailItem.Subject + ".";
                    mailItem.Display(false);
                }
                else if (selObject is Outlook.ContactItem)
                {
                    Outlook.ContactItem contactItem =
                        (selObject as Outlook.ContactItem);
                    itemMessage = "The item is a contact." +
                        " The full name is " + contactItem.Subject + ".";
                    contactItem.Display(false);
                }
                else if (selObject is Outlook.AppointmentItem)
                {
                    Outlook.AppointmentItem apptItem =
                        (selObject as Outlook.AppointmentItem);
                    itemMessage = "The item is an appointment." +
                        " The subject is " + apptItem.Subject + ".";
                }
                else if (selObject is Outlook.TaskItem)
                {
                    Outlook.TaskItem taskItem =
                        (selObject as Outlook.TaskItem);
                    itemMessage = "The item is a task. The body is "
                        + taskItem.Body + ".";
                }
                else if (selObject is Outlook.MeetingItem)
                {
                    Outlook.MeetingItem meetingItem =
                        (selObject as Outlook.MeetingItem);
                    itemMessage = "The item is a meeting item. " +
                         "The subject is " + meetingItem.Subject + ".";
                }
            }
            expMessage = expMessage + itemMessage;
        }
        catch (Exception ex)
        {
            expMessage = ex.Message;
        }
        MessageBox.Show(expMessage);
    }
    

    See How to: Programmatically determine the current Outlook item for more information.