首页 > 解决方案 > 从 Outlook Web/Office Online 更新任务时,Office 互操作无法从 Outlook 获取更新的 TaskItem

问题描述

我正在开发一个从 Outlook 桌面检索 TaskItem 并打开它的 Outlook 插件。这是我的代码。

private static Microsoft.Office.Interop.Outlook.TaskItem GetLatestTask(string entryId)
 {
    Microsoft.Office.Interop.Outlook.MAPIFolder taskFolder = Application.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderTasks);
    List<Microsoft.Office.Interop.Outlook.TaskItem> liTask = new List<Microsoft.Office.Interop.Outlook.TaskItem>();
    foreach (Microsoft.Office.Interop.Outlook.TaskItem taskItem in taskFolder.Items)
    {
        if (taskItem.EntryID == entryId)
            return taskItem;
    }
}

这通常工作正常。但是,如果我从 Outlook Web/Office Online 更新任务,然后尝试使用代码获取任务,我得到的任务不会更新并且仍然包含旧值。

因此,例如,我有一个名为“Test”的主题的任务,然后我在 Outlook Web 中将其更新为“Test Updated”,我仍然会得到一个名为“Test”的主题的任务。

如果我在 Outlook 桌面查看任务列表,我可以看到任务列表中的任务主题已经更新。但是打开它仍然会显示旧项目。

重新启动 Outlook 后,加载项会获取更新的项目。

谁能指出我正确的方向?谢谢你。

标签: outlookvstooutlook-addinoffice-interop

解决方案


首先,遍历文件夹中的所有项目并不是一个好主意:

foreach (Microsoft.Office.Interop.Outlook.TaskItem taskItem in taskFolder.Items)
    {
        if (taskItem.EntryID == entryId)
            return taskItem;
    }

相反,您可以考虑使用类的Find/FindNextRestrict方法Items。在以下带有代码示例的文章中阅读有关它们的更多信息:

同样依靠EntryID属性来识别 Outlook 中的项目也不是最好的方法。当项目被移动到另一个商店时,条目 ID 会发生变化,例如,从您的收件箱移动到 Microsoft Exchange Server 公用文件夹,或从一个个人文件夹 (.pst) 文件移动到另一个 .pst 文件。解决方案不应依赖于EntryID属性是唯一的,除非项目不会被移动。相反,您可以引入自己的自定义属性来识别项目。

如果您使用缓存数据很可能需要与服务器端同步数据。 SyncObjects是一组SyncObject代表用户发送/接收组的对象。使用该属性从对象SyncObjects返回对象。SyncObjectsNameSpace

Set mySyncObjects = Application.GetNameSpace("MAPI").SyncObjects

SyncObject.Start方法开始使用指定的Send\Receive 组同步用户的文件夹。

Public Sub Sync() 
 Dim nsp As Outlook.NameSpace 
 Dim sycs As Outlook.SyncObjects 
 Dim syc As Outlook.SyncObject 
 Dim i As Integer 
 Dim strPrompt As Integer 
 Set nsp = Application.GetNamespace("MAPI") 
 Set sycs = nsp.SyncObjects 
 For i = 1 To sycs.Count 
Set syc = sycs.Item(i) 
strPrompt = MsgBox( _ 
 "Do you wish to synchronize " & syc.Name &"?", vbYesNo) 
If strPrompt = vbYes Then 
 syc.Start 
End If 
 Next 
End Sub

希望在那之后,您的项目将使用新数据进行更新。


推荐阅读