Outlook ContactItem DeleteEvent

时间:2014-12-26 23:16:28

标签: c# events add-in outlook-addin

目前我正在为GMail联系人和Outlook撰写同步工具,但有一点问题: 当用户删除联系人时,我需要在我的插件中添加一个事件,否则同步工具会检测到Outlook端的丢失联系人,该工具将创建来自Google端的联系人。

我使用以下代码访问默认文件夹中的所有Outlook联系人:

Microsoft.Office.Interop.Outlook.NameSpace mapiNamespace = GetCurrentNamespace();
Microsoft.Office.Interop.Outlook.MAPIFolder contacts = mapiNamespace.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderContacts);

IList<Microsoft.Office.Interop.Outlook.ContactItem> items = new List<Microsoft.Office.Interop.Outlook.ContactItem>();

foreach (var contact in contacts.Items)
{
    items.Add(contact as Microsoft.Office.Interop.Outlook.ContactItem);
}

return items;

编辑1: 我已经尝试订阅John Saunders评论的BeforeDelete事件,但没有成功。当我尝试删除Outlook中的联系人时,该事件不会被解雇。

代码:

Microsoft.Office.Interop.Outlook.NameSpace mapiNamespace = GetCurrentNamespace();
_contactMapiFolder = mapiNamespace.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderContacts);

//IList<Microsoft.Office.Interop.Outlook.ContactItem> items = new List<Microsoft.Office.Interop.Outlook.ContactItem>();
this._contacts = new List<Microsoft.Office.Interop.Outlook.ContactItem>();

foreach (var contact in _contactMapiFolder.Items)
{
    Outlook.ContactItem item = contact as Microsoft.Office.Interop.Outlook.ContactItem;
    item.BeforeDelete += ItemOnBeforeDelete;
    this._contacts.Add(item);
}

return this._contacts;

任何人都可以举例说明哪些事件可用于此类mapi(特别是联系人文件夹)文件夹以及它们的工作方式?

1 个答案:

答案 0 :(得分:0)

在文件夹中的每个项目上设置事件接收器是一个非常糟糕的主意。

当Items.ItemRemove甚至触发时,您无法确定哪个项目已被删除。您别无选择,只能将当前集合与服务器或某种本地缓存中的内容进行比较。

您可以尝试使用Redemption及其RDOItems。ItemRemove事件 - 它会从文件夹内容表中传递PR_INSTANCE_KEY MAPI属性的值。如果您提前为所有项目缓存PR_INSTANCE_KEY属性的值(可以使用RDOITems.MAPITable.ExecSQL),则可以确定删除了哪个项目而不循环遍历文件夹中的所有项目。