如何知道删除了哪个 Outlook 日历项目?
How to know which Outlook Calendar item was deleted?
以下代码在创建新的 Outlook 日历项目时发出警报 and/or 已删除:
static void Main(string[] args)
{
var oApp = new Application();
var mapiNamespace = oApp.GetNamespace("MAPI");
var CalendarFolder = mapiNamespace.GetDefaultFolder(OlDefaultFolders.olFolderCalendar);
var outlookCalendarItems = CalendarFolder.Items;
outlookCalendarItems.ItemAdd += item => Console.WriteLine($"Created: {(item as AppointmentItem).Subject}");
outlookCalendarItems.ItemRemove += () => Console.WriteLine($"Removed: ...?");
Console.WriteLine("Done.");
Console.ReadLine();
}
问题是 outlookCalendarItems.ItemRemove
没有提供被删除的实际项目...
我怎么知道哪个项目被删除了(例如告诉它的主题)?
此事件异步触发,因此在 ItemRemove
事件触发时,该项目已经消失。即使在 MAPI 级别,当文件夹内容 table 触发 fnevTableModified | TABLE_ROW_DELETED
通知时,它仅提供 PR_INSTANCE_KEY
属性 的值(您可以看到它在 OutlookSpy(我是它的作者)中 - 单击 IMAPI 文件夹,转到 GetContentsTable table,在删除项目时查看页面底部的日志)。
如果使用 Redemption is an option (I am also its author), you can use RDOItems。ItemRemove
事件 - 它会传递 PR_INSTANCE_KEY
的值作为参数。
PR_INSTANCE_KEY
仅当您已经为文件夹中的所有项目或至少您感兴趣的项目缓存了 属性 的值时才有用。请记住PR_INSTANCE_KEY 无法在会话之间缓存 - 它仅对内容的特定实例有效 table (IMAPITable
).
另请记住,所有项目事件仅用于 UI 目的,不应将它们用于任何类型的同步 - 它们可能会在重负载下被丢弃。
如果您使用该事件进行同步,您的选择是使用 ItemRemove
事件作为您的同步必须 运行 尽快而不是稍后的提示,并循环遍历商店中的所有项目以找出更改的项目,或者,如果是 Exchange,您可以使用增量更改同步 API (ICS)。它在 Redemption 中作为 RDOFolderSynchronizer 对象公开。
以下代码在创建新的 Outlook 日历项目时发出警报 and/or 已删除:
static void Main(string[] args)
{
var oApp = new Application();
var mapiNamespace = oApp.GetNamespace("MAPI");
var CalendarFolder = mapiNamespace.GetDefaultFolder(OlDefaultFolders.olFolderCalendar);
var outlookCalendarItems = CalendarFolder.Items;
outlookCalendarItems.ItemAdd += item => Console.WriteLine($"Created: {(item as AppointmentItem).Subject}");
outlookCalendarItems.ItemRemove += () => Console.WriteLine($"Removed: ...?");
Console.WriteLine("Done.");
Console.ReadLine();
}
问题是 outlookCalendarItems.ItemRemove
没有提供被删除的实际项目...
我怎么知道哪个项目被删除了(例如告诉它的主题)?
此事件异步触发,因此在 ItemRemove
事件触发时,该项目已经消失。即使在 MAPI 级别,当文件夹内容 table 触发 fnevTableModified | TABLE_ROW_DELETED
通知时,它仅提供 PR_INSTANCE_KEY
属性 的值(您可以看到它在 OutlookSpy(我是它的作者)中 - 单击 IMAPI 文件夹,转到 GetContentsTable table,在删除项目时查看页面底部的日志)。
如果使用 Redemption is an option (I am also its author), you can use RDOItems。ItemRemove
事件 - 它会传递 PR_INSTANCE_KEY
的值作为参数。
PR_INSTANCE_KEY
仅当您已经为文件夹中的所有项目或至少您感兴趣的项目缓存了 属性 的值时才有用。请记住PR_INSTANCE_KEY 无法在会话之间缓存 - 它仅对内容的特定实例有效 table (IMAPITable
).
另请记住,所有项目事件仅用于 UI 目的,不应将它们用于任何类型的同步 - 它们可能会在重负载下被丢弃。
如果您使用该事件进行同步,您的选择是使用 ItemRemove
事件作为您的同步必须 运行 尽快而不是稍后的提示,并循环遍历商店中的所有项目以找出更改的项目,或者,如果是 Exchange,您可以使用增量更改同步 API (ICS)。它在 Redemption 中作为 RDOFolderSynchronizer 对象公开。