2012-03-21 23 views
1

私は、予定と連絡先(および後で仕事も同様)にEventHandlersを使用したいと思います。Outlookの予定と連絡先のEventHandler

は、私は、次のコードを実行クラス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); 

をそして私は、次のコードexecutsクラスAppointmentPogram持って:私は両方のためのイベントハンドラを使用する場合は

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-EventHandlerを作成するコードをコメントアウトすると、Appointment-EventHandlerが起動されます。 (私のプログラムでは、contact-EventHandlerが最初に作成され、その後にAppointment-EventHandlerが作成されます)。

EventHandlerは一度しか作成せず、パラメータとして与えられたオブジェクトの型をチェックできます。しかし残念なことに、contact-EventHandlerはolFolderContactsとappointment-Eventhandlers 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レベルで行われています。カレンダーと連絡先は異なるフォルダであるため、1回の登録で変更イベントの両方を聞くことはできません。Folderストアごとに別々のハンドラが必要です。

イベントが発生していない場合は、変数myAppointmentItemsmyContactItemsをクラスレベル変数として保持していないスコープの問題が原因である可能性があります。 related SO postを参照してください。

+0

Hey SliverNinja、 すぐにお返事ありがとうございます。 SOの投稿に示されているコードを移動しました(上記参照)。 私は既に、フォルダストアごとに別々のハンドラを持っていると思います。 問題は解決しません。最初はEventHandlerが起動しましたが、それ以降はもう発生しません。 ご協力いただければ幸いです。 – joma

+0

誰かがアイデアを持っていますか?問題に関する詳細情報を提供できますか? – joma

+2

'Outlook.Items myContactItems'と' Outlook.Items myAppointmentItems'はあなたのクラスのメンバである必要があります。 'ThisAddIn_Startup'の中でそれらを宣言しないか、GC'dまで一度だけ起動します。イベントが一度だけ発生した場合は、GC'Dを取得する変数のスコープの問題であることが保証されます。 – SliverNinja

関連する問題