从 Outlook Web/Office 在线更新任务时,Office 互操作无法从 outlook 获取更新的 TaskItem
Office interop is unable to get the updated TaskItem from outlook when task is updated from Outlook Web/Office Online
我正在开发一个 outlook 插件,它从 outlook 桌面检索一个 TaskItem 并将其打开。这是我的代码。
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 在线更新任务,然后尝试使用代码获取任务,我获取的任务不会更新并且仍然包含旧值。
例如,我有一个主题名为“测试”的任务,然后我在 Outlook Web 中将其更新为“测试已更新”,我仍然会收到一个主题为“测试”的任务。
如果我在 outlook 桌面中查看任务列表,我可以看到任务的主题已经在任务列表中更新。但是打开它仍然会显示旧项目。
一旦我重新启动 Outlook,加载项就会获得更新的项目。
谁能指出我正确的方向?谢谢。
首先,遍历文件夹中的所有项目并不是一个好主意:
foreach (Microsoft.Office.Interop.Outlook.TaskItem taskItem in taskFolder.Items)
{
if (taskItem.EntryID == entryId)
return taskItem;
}
相反,您可以考虑使用 Items
class 的 Find
/FindNext
或 Restrict
方法。在以下带有代码示例的文章中阅读有关它们的更多信息:
- How To: Use Find and FindNext methods to retrieve Outlook mail items from a folder (C#, VB.NET)
- How To: Use Restrict method to retrieve Outlook mail items from a folder
同样依靠 EntryID
属性 来识别 Outlook 中的项目并不是最好的方法。当项目移动到另一个存储区时,条目 ID 会发生变化,例如,从您的收件箱到 Microsoft Exchange Server public 文件夹,或从一个个人文件夹 (.pst) 文件到另一个 .pst 文件。除非不会移动项目,否则解决方案不应依赖于 EntryID
属性 的唯一性。相反,您可以引入自己的习惯 属性 来识别项目。
如果您使用缓存数据,很可能需要将数据与服务器端同步。 SyncObjects
是一组 SyncObject
个对象,代表用户的 Send/Receive 个组。使用 SyncObjects
属性 到 return 来自 NameSpace
对象的 SyncObjects
对象。
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
希望在那之后,您的项目将更新为新数据。
我正在开发一个 outlook 插件,它从 outlook 桌面检索一个 TaskItem 并将其打开。这是我的代码。
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 在线更新任务,然后尝试使用代码获取任务,我获取的任务不会更新并且仍然包含旧值。
例如,我有一个主题名为“测试”的任务,然后我在 Outlook Web 中将其更新为“测试已更新”,我仍然会收到一个主题为“测试”的任务。
如果我在 outlook 桌面中查看任务列表,我可以看到任务的主题已经在任务列表中更新。但是打开它仍然会显示旧项目。
一旦我重新启动 Outlook,加载项就会获得更新的项目。
谁能指出我正确的方向?谢谢。
首先,遍历文件夹中的所有项目并不是一个好主意:
foreach (Microsoft.Office.Interop.Outlook.TaskItem taskItem in taskFolder.Items)
{
if (taskItem.EntryID == entryId)
return taskItem;
}
相反,您可以考虑使用 Items
class 的 Find
/FindNext
或 Restrict
方法。在以下带有代码示例的文章中阅读有关它们的更多信息:
- How To: Use Find and FindNext methods to retrieve Outlook mail items from a folder (C#, VB.NET)
- How To: Use Restrict method to retrieve Outlook mail items from a folder
同样依靠 EntryID
属性 来识别 Outlook 中的项目并不是最好的方法。当项目移动到另一个存储区时,条目 ID 会发生变化,例如,从您的收件箱到 Microsoft Exchange Server public 文件夹,或从一个个人文件夹 (.pst) 文件到另一个 .pst 文件。除非不会移动项目,否则解决方案不应依赖于 EntryID
属性 的唯一性。相反,您可以引入自己的习惯 属性 来识别项目。
如果您使用缓存数据,很可能需要将数据与服务器端同步。 SyncObjects
是一组 SyncObject
个对象,代表用户的 Send/Receive 个组。使用 SyncObjects
属性 到 return 来自 NameSpace
对象的 SyncObjects
对象。
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
希望在那之后,您的项目将更新为新数据。