c# - Outlook 中约会和联系人的事件处理程序

标签 c# event-handling outlook contacts appointment

我想将事件处理程序用于约会和联系人(以及稍后的任务)。

我有一个 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 类,它执行以下代码:

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,则 Appointment-EventHandler 将不会触发。但是,如果我注释掉创建 Contact-EventHandlers 的代码,则会触发 Appointment-EventHandlers。 (在我的程序中,首先创建 contact-EventHandler,然后创建 Appointment-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);
    }
    ...

}

最佳答案

您寻找的事件处理程序(ItemAddItemChangeItemRemove)是在Folder 级别完成的。由于日历和联系人是不同的文件夹 - 您无法通过一次注册来监听这两个文件夹的更改事件 - 它需要为每个文件夹存储提供单独的处理程序。

如果您的事件未触发,可能是由于范围问题导致您没有将变量 myAppointmentItemsmyContactItems 保留为类级别变量。请参阅related SO post .

关于c# - Outlook 中约会和联系人的事件处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9805147/

相关文章:

c# - 如何使用 LINQ 对 DISTINCT 行的值求和

jquery - 音频事件不会触发 jQuery on play 事件

c# - 访问当前在 Outlook 2007 中选择的文本

outlook - RESTAPINotEnabledForComponentSharedMailbox 错误

带有附件问题的 php outlook 日历事件

c# - 定时器的性能成本

c# - 使用 Interop Excel 时,SSIS 脚本任务断点不起作用

javascript - 如何使用 .bind(this) 删除对象的事件监听器?

javascript - 将多个字符串值作为参数从服务器端传递给 JavaScript 函数

用于通过单击按钮激活 Fancybox Iframe 的 jQuery 事件处理程序