2012-03-21 105 views
1

我想使用約會和聯繫人事件處理程序(以及稍後的任務)。Outlook中約會和聯繫人的事件處理程序

我有一個類ContactProgram執行以下代碼:

Outlook.Items myContactItems = myApplication.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderContacts).Items; 
myContactItems.ItemAdd += new Outlook.ItemsEvents_ItemAddEventHandler(myContactItems_Add); 
myContactItems.ItemChange += new Outlook.ItemsEvents_ItemChangeEventHandler(myContactItems_Change); 
myContactItems.ItemRemove += new Outlook.ItemsEvents_ItemRemoveEventHandler(myContactItems_Remove); 

而且我有一個類AppointmentPogram是executs下面的代碼:如果我用這兩個事件處理程序,則

Outlook.Items myAppointmentItems = myApplication.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderCalendar).Items; 
myAppointmentItems.ItemAdd += new Outlook.ItemsEvents_ItemAddEventHandler(myAppointmentItems_Add); 
myAppointmentItems.ItemChange += new Outlook.ItemsEvents_ItemChangeEventHandler(myAppointmentItems_Change); 
myAppointmentItems.ItemRemove += new Outlook.ItemsEvents_ItemRemoveEventHandler(myAppointmentItems_Remove); 

Appointment-EventHandler不會觸發。但是,如果我註釋掉創建Contact-EventHandlers的代碼,那麼Appointment-EventHandlers會被觸發。 (在我的程序中,首先創建contact-EventHandlers,然後是Appointment-EventHandler。)

我只能創建一次EventHandler,然後檢查作爲參數給出的對象的類型。但不幸的是,contact-EventHandlers指出olFolderContacts和約會事件處理程序olFolderCalendar。

有什麼建議嗎?

編輯: 我的新代碼:

... 
using Outlook = Microsoft.Office.Interop.Outlook; 
using Office = Microsoft.Office.Core; 
public partial class ThisAddIn 
{ 
    private static Outlook.Application myApplication = new Outlook.Application(); 
    private List<OutlookContact> allContacts = new List<OutlookContact>(); 
    private Outlook.Folder myContactsFolder = (Outlook.Folder)myApplication.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderContacts); 
    private ContactProgram contactProgram; 

    private List<OutlookAppointment> allAppointments = new List<OutlookAppointment>(); 
    private Outlook.Folder myAppointmentsFolder = (Outlook.Folder)myApplication.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderCalendar); 
    private AppointmentProgram appointmentProgram; 

    private void ThisAddIn_Startup(object sender, System.EventArgs e) 
    { 
     contactProgram = new ContactProgram(myApplication, allContacts, myContactsFolder); 
     contactProgram.Start(); 
     appointmentProgram = new AppointmentProgram(myApplication, allAppointments, myAppointmentsFolder); 
     appointmentProgram.Start(); 

     //initialise EventHandlers 
     //myContactItems = myApplication.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderContacts).Items;//= myContactsFolder.Items; 
     Outlook.Items myContactItems = myContactsFolder.Items; 
     myContactItems.ItemAdd += new Outlook.ItemsEvents_ItemAddEventHandler(myContactItems_Add); 
     myContactItems.ItemChange += new Outlook.ItemsEvents_ItemChangeEventHandler(myContactItems_Change); 
     myContactItems.ItemRemove += new Outlook.ItemsEvents_ItemRemoveEventHandler(myContactItems_Remove); 

     //myAppointmentItems = myApplication.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderCalendar).Items; 
     Outlook.Items myAppointmentItems = myAppointmentsFolder.Items; 
     myAppointmentItems.ItemAdd += new Outlook.ItemsEvents_ItemAddEventHandler(myAppointmentItems_Add); 
     myAppointmentItems.ItemChange += new Outlook.ItemsEvents_ItemChangeEventHandler(myAppointmentItems_Change); 
     myAppointmentItems.ItemRemove += new Outlook.ItemsEvents_ItemRemoveEventHandler(myAppointmentItems_Remove); 
    } 

    private static void myContactItems_Add(object item) 
    { 
     ContactProgram.myContactItems_Add(item); 
    } 
    ... 

} 

回答

3

你所尋求的事件處理程序(ItemAddItemChangeItemRemove)都在Folder級別進行。由於日曆和聯繫人是不同的文件夾 - 您無法通過單一註冊來收聽更改事件 - 每個Folder商店都需要單獨的處理程序。

如果您的事件沒有解僱,那很可能是因爲您沒有將變量myAppointmentItemsmyContactItems保留爲類級變量的範圍問題。見related SO post

+0

Hey SliverNinja, 感謝您的快速回答。 我移動了我的代碼,如SO帖子中所示(參見上文)。 我想我已經爲每個文件夾存儲分開處理程序,不是嗎? 問題仍然存在。 EventHandlers在一開始就開始工作,但後來不再工作。 任何幫助,將不勝感激。 – joma 2012-03-21 15:31:01

+0

有沒有人有想法?我可以向您提供有關該問題的更多信息嗎? – joma 2012-04-16 10:03:50

+2

'Outlook.Items myContactItems'和'Outlook.Items myAppointmentItems'需要成爲你的類的成員 - 不要在'ThisAddIn_Startup'中聲明它們,否則它們只會觸發一次,直到GC'd。如果你的事件只被解僱一次 - 它保證是你的變量獲得GC'd的範圍問題。 – SliverNinja 2012-04-16 12:44:17

相關問題