将项目移至特定文件夹Outlook VSTO时附加事件侦听器

时间:2018-06-19 11:58:37

标签: c# visual-studio outlook vsto outlook-addin

我想要实现的是当用户将项目从Outlook中的任何文件夹(收件箱,垃圾邮件,草稿等)移动到特定的用户创建的文件夹(例如“ abc”)时,附加一个事件侦听器。 / p>

在此阶段,我只想在将项目移至文件夹“ abc”时显示“ Hello World”。

我知道我可能可以利用Folder.BeforeItemMove事件,但是该事件是用于将项目从特定文件夹中移出的,并且我想要将项目移入特定文件夹中时的事件。 / strong>

我也尝试了FolderChange事件,这很有意义,因为当文件夹中发生事件时它会触发。但是它的事件处理程序仅带有Folder参数,而不是EventArgs之类的东西,因此我无法区分用户操作(添加,移动,删除等)

我的解决方法是使用Folder.BeforeItemMove中的循环将ThisAddIn_Startup事件添加到除“ abc”之外的每个文件夹中。

foreach(Folder f in folders)
{
 f.BeforeItemMove += new Microsoft.Office.Interop.Outlook.MAPIFolderEvents_12_BeforeItemMoveEventHandler(BeforeItemMove);
}

但是它只能工作一次,而不能贯穿整个生命周期。我知道这可能是因为我没有在收集它们的类级别中声明所有文件夹属性,但是我该怎么做呢?如果我只需要监视说“收件箱”,我就可以做到

Folder Inbox

private void ThisAddIn_Startup(object sender, System.EventArgs e)
    {
        Folderroot = (Folder)this.Application.Session.DefaultStore.GetRootFolder();
        inbox = root.Folders["Inbox"];
        inbox.BeforeItemMove += new Microsoft.Office.Interop.Outlook.MAPIFolderEvents_12_BeforeItemMoveEventHandler(BeforeItemMove);
    }

这样,GC将不会收集“收件箱”文件夹。 但是当需要监视多个文件夹时,我不知道该如何处理。

我在正确的道路上还是有更好的解决方案?

2 个答案:

答案 0 :(得分:1)

好像您对Items类的ItemAdd事件感兴趣。将一个或多个项目添加到指定集合时将触发该事件。一次(超过16个)大量项目添加到文件夹时,不会运行此事件。

您必须在代码中单独订阅每个文件夹/项目,以获取所有文件夹的事件。

答案 1 :(得分:0)

创建一个包装器类,该包装器类使用一个Items对象并将其存储为类成员。在该包装器类中为该对象设置一个Items.ItemAdd事件处理程序。在您的插件中,使用包装器列表(List<MyWrapper>)来存储要监视的每个文件夹的Items集合的包装器。这样可以防止收集Items对象。