目前我正在为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(特别是联系人文件夹)文件夹以及它们的工作方式?
答案 0 :(得分:0)
在文件夹中的每个项目上设置事件接收器是一个非常糟糕的主意。
当Items.ItemRemove甚至触发时,您无法确定哪个项目已被删除。您别无选择,只能将当前集合与服务器或某种本地缓存中的内容进行比较。
您可以尝试使用Redemption及其RDOItems。ItemRemove事件 - 它会从文件夹内容表中传递PR_INSTANCE_KEY MAPI属性的值。如果您提前为所有项目缓存PR_INSTANCE_KEY属性的值(可以使用RDOITems.MAPITable.ExecSQL),则可以确定删除了哪个项目而不循环遍历文件夹中的所有项目。