You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 17:04:52