2014-02-19 37 views
1

我正在寫一個Outlook插件。我需要在任何文件夾中的任何電子郵件更改標籤時(即添加或刪除類別時)通知插件。我想過使用ItemChange事件(link),但不會被解僱,不管我對電子郵件做什麼(添加類別,標誌,移動它等等)。Outlook插件 - ItemChange未被調用

我知道你需要創建一個成員變量並將其設置爲MapiFolder.Items,以防止垃圾收集,因爲不會對垃圾收集的項目調用事件。但即便如此,這個事件也沒有被調用。

我的問題是:

1)爲什麼不ItemChange中調用下面的代碼,在Outlook中,當我試圖以任何方式改變(例如增加一個類別)的電子郵件?

2)究竟是否應該爲給定的電子郵件調用ItemChange事件?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml.Linq; 
using Outlook = Microsoft.Office.Interop.Outlook; 
using Office = Microsoft.Office.Core; 

namespace TestOutlookAddIn1 
{ 
    public partial class ThisAddIn 
    { 

     List<Outlook.Items> mItems = new List<Outlook.Items>(); 

     private void ThisAddIn_Startup(object sender, System.EventArgs e) 
     { 

      var fo = Application.Session.Folders; 
      foreach (Outlook.Folder f in fo) 
      { 
       var items = f.Items; 
       mItems.Add(items); // prevent garbage collection 
       items.ItemChange += Items_ItemChange; 
       items.ItemAdd += items_ItemAdd; 
       items.ItemRemove += items_ItemRemove; 


      } 
     } 

     void items_ItemRemove() 
     { 
      throw new NotImplementedException(); 
     } 

     void items_ItemAdd(object Item) 
     { 
      throw new NotImplementedException(); 
     } 

     void Items_ItemChange(object Item) // NOT BEING CALLED <<<<< 
     { 
      throw new NotImplementedException(); 
     } 


    } 
} 

回答

0

對不起,我發現問題:我沒有反覆發現子文件夾。

 var fo = Application.Session.Folders; 
     foreach (Outlook.Folder f in fo) 
     { 

      foreach (Outlook.Folder f2 in f.Folders) 
      { 

       var items = f2.Items; 
       mItems.Add(items); 
       items.ItemChange += Items_ItemChange; 
       items.ItemAdd += items_ItemAdd; 
       items.ItemRemove += items_ItemRemove; 

      } 

具有完全遞歸:

var frontier = new Queue<Folder>(); 
foreach (Folder f in lSession.Folders) 
{ 
    frontier.Enqueue(f); 
} 

while (frontier.Any()) 
{ 
    var curFolder = frontier.Dequeue(); 
    curFolder.Items.ItemChange += Items_ItemChange; 

    foreach (Folder ch in curFolder.Folders) 
    { 
     frontier.Enqueue(ch); 
    } 
} 


     } 
+1

你只打算2級深。如果你真的需要這個,你需要有一個函數來處理每個文件夾併爲每個文件夾遞歸調用該函數。 –

+0

是的,我只做了一個。謝謝 – seguso