C# Outlook中约会和联系人的EventHandler

C# Outlook中约会和联系人的EventHandler,c#,event-handling,outlook,contact,appointment,C#,Event Handling,Outlook,Contact,Appointment,我想在约会和联系人(以及以后的任务)中使用EventHandler 我有一个类ContactProgram,它执行以下代码: Outlook.Items myContactItems = myApplication.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderContacts).Items; myContactItems.ItemAdd += new Outlook.ItemsEvents_ItemAddEventHand

我想在约会和联系人(以及以后的任务)中使用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);
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);
我有一个类任命程序,它执行以下代码:

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);
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);
如果我同时使用EventHandler,那么约会EventHandler将不会启动。但是如果我注释掉创建联系人事件处理程序的代码,那么约会事件处理程序将被触发。 (在我的程序中,首先创建联系人事件处理程序,然后创建约会事件处理程序。)

我只能创建一次EventHandler,然后检查作为参数提供的对象的类型。但不幸的是,联系人事件处理程序需要指向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);
    }
    ...

}
。。。
使用Outlook=Microsoft.Office.Interop.Outlook;
使用Office=Microsoft.Office.Core;
公共部分类ThisAddIn
{
私有静态Outlook.Application myApplication=新建Outlook.Application();
私有列表所有联系人=新列表();
私有Outlook.Folder myContactsFolder=(Outlook.Folder)myApplication.Session.GetDefaultFolder(Outlook.OldDefaultFolders.olFolderContacts);
私人联络计划联络计划;
私有列表allappoints=新列表();
私有Outlook.Folder myAppointmentsFolder=(Outlook.Folder)myApplication.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderCalendar);
私人任命计划任命计划;
私有void ThisAddIn_启动(对象发送方,System.EventArgs e)
{
contactProgram=新的contactProgram(我的应用程序、所有联系人、myContactsFolder);
contactProgram.Start();
任命计划=新任命计划(我的申请、所有任命、我的任命文件夹);
appointmentProgram.Start();
//初始化事件处理程序
//myContactItems=myApplication.Session.GetDefaultFolder(Outlook.OlDefaultFolders.OlFolders.Contacts).Items;/=myContactsFolder.Items;
Outlook.Items myContactItems=myContactsFolder.Items;
myContactItems.ItemAdd+=新Outlook.ItemsEvents\u ItemAddEventHandler(myContactItems\u Add);
myContactItems.ItemChange+=新建Outlook.ItemsEvents\u ItemChangeEventHandler(myContactItems\u Change);
myContactItems.ItemRemove+=新建Outlook.ItemsEvents\u ItemRemoveEventHandler(myContactItems\u Remove);
//myAppointmentItems=myApplication.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderCalendar).Items;
Outlook.Items myAppointmentItems=MyAppointsFolder.Items;
myAppointmentItems.ItemAdd+=新建Outlook.ItemsEvents\u ItemAddEventHandler(myAppointmentItems\u Add);
myAppointmentItems.ItemChange+=新建Outlook.ItemsEvents\u ItemChangeEventHandler(myAppointmentItems\u Change);
myAppointmentItems.ItemRemove+=新建Outlook.ItemsEvents\u ItemRemoveEventHandler(myAppointmentItems\u Remove);
}
私有静态void myContactItems_Add(对象项)
{
接触项目。霉菌感染添加(项目);
}
...
}

您查找的事件处理程序(
ItemAdd
ItemChange
iteremove
)在
文件夹
级别完成。由于日历和联系人是不同的文件夹-您无法通过一次注册同时侦听这两个文件夹中的更改事件-因此每个
文件夹
存储都需要单独的处理程序


如果您的事件未触发,可能是由于范围问题,您没有将变量
myAppointmentItems
myContactItems
保留为类级变量。请参阅。

您所查找的事件处理程序(
ItemAdd
ItemChange
iteremove
)在
文件夹
级别完成。由于日历和联系人是不同的文件夹-您无法通过一次注册同时侦听这两个文件夹中的更改事件-因此每个
文件夹
存储都需要单独的处理程序


如果您的事件未触发,可能是由于范围问题,您没有将变量
myAppointmentItems
myContactItems
保留为类级变量。请参阅。

嘿,斯莱维尼加,谢谢你的快速回答。我按照SO帖子中的指示移动了代码(见上文)。我想我已经为每个文件夹存储设置了单独的处理程序,不是吗?这个问题仍然存在。在开始时,EventHandlers会启动,但随后不会再启动。任何帮助都将不胜感激。有人有主意吗?我可以为您提供有关此问题的详细信息吗?
Outlook.Items myContactItems
Outlook.Items myAppointmentItems
必须是您的类的成员-不要在
ThisAddIn\u启动
中声明它们,否则在GC启动之前它们只会启动一次。如果您的事件只触发一次,那么您的变量得到GC'd肯定是一个范围问题。我按照SO帖子中的指示移动了代码(见上文)。我想我已经为每个文件夹存储设置了单独的处理程序,不是吗?这个问题仍然存在。在开始时,EventHandlers会启动,但随后不会再启动。任何帮助都将不胜感激。有人有主意吗?我可以为您提供有关此问题的详细信息吗?
Outlook.Items myContactItems
Outlook.Items myAppointmentItems
必须是您的类的成员-不要在
ThisAddIn\u启动
中声明它们,否则在GC启动之前它们只会启动一次。如果您的事件只触发一次,那么当您的变量得到GC'd时,这肯定是一个范围问题。