展望联系人项目删除事件

本文关键字:删除 事件 项目 联系人 | 更新日期: 2023-09-27 18:35:26

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

我正在使用以下代码从默认文件夹访问所有 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(尤其是联系人文件夹)文件夹有哪些事件可用以及它们是如何工作的?

展望联系人项目删除事件

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

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

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