![]() |
(VSTO SE) folder.Items.ItemAdd Event does not fire
I am trying to handle the ItemAdd event on a number of folders under my default mailbox in Outlook.
I find the Event fires for a while and then stops. Can anyone help explain why? The following code is in from a VSTO SE AddIn. 1) I find a folder which I will handle the AddItem event for. 2) Call SetEventHandler which registers the event handler 3) Adds the a folder to a class level collection of folders (Step 3 is to try an ensure the folder doesn't drop out of scope and get garbage collected) 4) Call SetEventHandler for each sub folder private static SortedDictionaryString, Outlook.MAPIFolder m_ItemAddHandled = new SortedDictionarystring, Outlook.MAPIFolder(); private void ThisAddIn_Startup(object sender, System.EventArgs e) { Outlook.MAPIFolder myRootFolder = FindFolder(...); if (colligoRootFolder != null) { SetEventHandler(myRootFolder); } } private void SetEventHandler(Outlook.MAPIFolder parent) { System.Diagnostics.Debug.Print("SetEventHandler(" + parent.FullFolderPath + ")"); parent.Items.ItemAdd += new Outlook.ItemsEvents_ItemAddEventHandler(Items_Item Add); m_ItemAddHandled.Add(parent.FullFolderPath, parent); foreach (Outlook.MAPIFolder folder in parent.Folders) { SetEventHandler(folder); } } void Items_ItemAdd(object Item) { MessageBox.Show("Items_ItemAdd"); } |
(VSTO SE) folder.Items.ItemAdd Event does not fire
parent.Items must be a class variable (see below in red) to make sure it stays referenced and alive to make sure it is not collect by the GC.
In case of multiple Items objects, use a list to store them. private static SortedDictionaryString, Outlook.MAPIFolder m_ItemAddHandled = new SortedDictionarystring, Outlook.MAPIFolder(); private void ThisAddIn_Startup(object sender, System.EventArgs e) { Outlook.MAPIFolder myRootFolder = FindFolder(...); if (colligoRootFolder != null) { SetEventHandler(myRootFolder); } } public Outlook.Items m_Items; private void SetEventHandler(Outlook.MAPIFolder parent) { System.Diagnostics.Debug.Print("SetEventHandler(" + parent.FullFolderPath + ")"); m_Items = parent.Items; m_Items.ItemAdd += new Outlook.ItemsEvents_ItemAddEventHandler(Items_Item Add); m_ItemAddHandled.Add(parent.FullFolderPath, parent); //foreach (Outlook.MAPIFolder folder in parent.Folders) //{ // SetEventHandler(folder); //} } void Items_ItemAdd(object Item) { MessageBox.Show("Items_ItemAdd"); } Dmitry Streblechenko (MVP) http://www.dimastr.com/ OutlookSpy - Outlook, CDO and MAPI Developer Tool "David" wrote in message ... I am trying to handle the ItemAdd event on a number of folders under my default mailbox in Outlook. I find the Event fires for a while and then stops. Can anyone help explain why? The following code is in from a VSTO SE AddIn. 1) I find a folder which I will handle the AddItem event for. 2) Call SetEventHandler which registers the event handler 3) Adds the a folder to a class level collection of folders (Step 3 is to try an ensure the folder doesn't drop out of scope and get garbage collected) 4) Call SetEventHandler for each sub folder private static SortedDictionaryString, Outlook.MAPIFolder m_ItemAddHandled = new SortedDictionarystring, Outlook.MAPIFolder(); private void ThisAddIn_Startup(object sender, System.EventArgs e) { Outlook.MAPIFolder myRootFolder = FindFolder(...); if (colligoRootFolder != null) { SetEventHandler(myRootFolder); } } private void SetEventHandler(Outlook.MAPIFolder parent) { System.Diagnostics.Debug.Print("SetEventHandler(" + parent.FullFolderPath + ")"); parent.Items.ItemAdd += new Outlook.ItemsEvents_ItemAddEventHandler(Items_Item Add); m_ItemAddHandled.Add(parent.FullFolderPath, parent); foreach (Outlook.MAPIFolder folder in parent.Folders) { SetEventHandler(folder); } } void Items_ItemAdd(object Item) { MessageBox.Show("Items_ItemAdd"); } |
(VSTO SE) folder.Items.ItemAdd Event does not fire
Thanks for the response Dmitry.
Regarding your comment that parent.Items must be a class level variable. I assume this is so that it is not garbage collected. I have tried to handle this by putting the folder in the class-level "m_ItemAddHandled" collection. Do you think this does not work? It is difficult to use parent as a class level variable because I do not know how many times the SetEventHandler will recurse. |
(VSTO SE) folder.Items.ItemAdd Event does not fire
No, saving MAPIFolder won't help since you need to keep a reference to the
object raising the evenst, i.e. Items. If you do not know how many objects you will be referencing, store them in a list which can have as many items as you want. Dmitry Streblechenko (MVP) http://www.dimastr.com/ OutlookSpy - Outlook, CDO and MAPI Developer Tool "Anyone for Coffee?" wrote in message ... Thanks for the response Dmitry. Regarding your comment that parent.Items must be a class level variable. I assume this is so that it is not garbage collected. I have tried to handle this by putting the folder in the class-level "m_ItemAddHandled" collection. Do you think this does not work? It is difficult to use parent as a class level variable because I do not know how many times the SetEventHandler will recurse. |
(VSTO SE) folder.Items.ItemAdd Event does not fire
Thanks Dmitry - that was it.
Is there a way of finding out what type of object has been added? |
(VSTO SE) folder.Items.ItemAdd Event does not fire
Sure, check the Class property using late binding, then cast the object
appropriately. Dmitry Streblechenko (MVP) http://www.dimastr.com/ OutlookSpy - Outlook, CDO and MAPI Developer Tool "Anyone for Coffee?" wrote in message ... Thanks Dmitry - that was it. Is there a way of finding out what type of object has been added? |
All times are GMT +1. The time now is 05:08 AM. |
Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 2.4.0
Copyright ©2004-2006 OutlookBanter.com