如何使用C# VSTO将Outlook日历从一个组移至另一个组?
解决Outlook VSTO日历导航组转移问题
你的错误根源是混淆了NavigationFolder和MAPIFolder的区别:NavigationFolders.Add()方法要求传入实际的日历文件夹对象(MAPIFolder),而不是导航面板中的NavigationFolder显示条目。NavigationFolder只是导航面板里的快捷显示项,它关联的真实日历文件夹存储在Folder属性中。
修正后的代码(仅调整导航分组显示)
如果只是想把日历在导航面板的分组从"My calendars"移到"Shared calendars"(不移动实际数据),使用以下代码:
Outlook.NameSpace mapiNamespace = Application.GetNamespace("MAPI"); Outlook.CalendarModule calendarModule = (Outlook.CalendarModule)mapiNamespace.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderCalendar) .GetExplorer().NavigationPane.Modules.GetNavigationModule(Outlook.OlNavigationModuleType.olModuleCalendar); Outlook.NavigationGroups navGroups = calendarModule.NavigationGroups; Outlook.NavigationGroup source = null; Outlook.NavigationGroup dest = null; foreach (Outlook.NavigationGroup navGroup in navGroups) { if (navGroup.Name == "My calendars") source = navGroup; else if (navGroup.Name == "Shared calendars") dest = navGroup; } // 遍历源组中的导航文件夹,添加到目标组 foreach (Outlook.NavigationFolder navFolder in source.NavigationFolders) { // 获取关联的实际日历文件夹 Outlook.MAPIFolder targetCalendar = navFolder.Folder as Outlook.MAPIFolder; if (targetCalendar != null) { // 添加到目标导航组 dest.NavigationFolders.Add(targetCalendar); // 如果需要从源组移除该日历的显示,取消下面注释 // source.NavigationFolders.Remove(navFolder); } }
移动实际日历数据的场景
如果需要将日历的实际数据从原位置转移到新位置(比如从个人邮箱移到共享邮箱),需要先复制日历项目,再调整导航组:
Outlook.NameSpace mapiNamespace = Application.GetNamespace("MAPI"); Outlook.CalendarModule calendarModule = (Outlook.CalendarModule)mapiNamespace.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderCalendar) .GetExplorer().NavigationPane.Modules.GetNavigationModule(Outlook.OlNavigationModuleType.olModuleCalendar); Outlook.NavigationGroups navGroups = calendarModule.NavigationGroups; Outlook.NavigationGroup source = null; Outlook.NavigationGroup dest = null; foreach (Outlook.NavigationGroup navGroup in navGroups) { if (navGroup.Name == "My calendars") source = navGroup; else if (navGroup.Name == "Shared calendars") dest = navGroup; } // 获取目标共享邮箱的日历容器(替换为你的共享邮箱地址) Outlook.Recipient sharedRecipient = mapiNamespace.CreateRecipient("shared_mailbox@yourdomain.com"); sharedRecipient.Resolve(); Outlook.MAPIFolder sharedMailboxRoot = mapiNamespace.GetSharedDefaultFolder(sharedRecipient, Outlook.OlDefaultFolders.olFolderCalendar).Parent; foreach (Outlook.NavigationFolder navFolder in source.NavigationFolders) { Outlook.MAPIFolder sourceCalendar = navFolder.Folder as Outlook.MAPIFolder; if (sourceCalendar != null) { // 在共享邮箱创建新日历文件夹 Outlook.MAPIFolder newCalendar = sharedMailboxRoot.Folders.Add(sourceCalendar.Name, Outlook.OlDefaultFolders.olFolderCalendar); // 复制所有日历项目到新文件夹 foreach (object itemObj in sourceCalendar.Items) { if (itemObj is Outlook.AppointmentItem appointment) { appointment.CopyTo(newCalendar); } } // 将新日历添加到目标导航组 dest.NavigationFolders.Add(newCalendar); // 移除原导航项并删除原日历(可选操作) source.NavigationFolders.Remove(navFolder); sourceCalendar.Delete(); } }
内容的提问来源于stack exchange,提问作者Gadzhik
相关产品推荐
相关产品推荐

