VSTO Outlook如何在定期会议中获取一系列AppointmentItems中的上一个AppointmentItem

时间:2018-06-21 04:22:22

标签: vsto outlook-addin

我目前正在为AppointmentItem开发Outlook插件。如果AppointmentItem是定期会议“链”的成员,我想检索/查找作为上次会议的AppointmentItem。我怎样才能做到这一点?

我想出了以下部分解决方案:

Outlook.AppointmentItem item = (Outlook.AppointmentItem)inspector.CurrentItem;
if (item.IsRecurring) {
    Outlook.RecurrencePattern pattern = item.GetRecurrencePattern(); 
    Outlook.OlRecurrenceType occurenceType = pattern.RecurrenceType;
    int dayFactor = 0;
    switch (occurenceType) {
        case Outlook.OlRecurrenceType.olRecursDaily:                            
           dayFactor = 1;
           break;
        case Outlook.OlRecurrenceType.olRecursWeekly:
        default:
           dayFactor = 7;
           break;
        // TODO handly all other cases of RecurrenceType
    }
    Outlook.AppointmentItem lastItem = pattern.GetOccurrence(item.StartInStartTimeZone.AddDays(-1*pattern.Interval*dayFactor));                         

但是,这仅处理很少的“简单”案例。 特别是在计算时每月的每个第一个星期二对我来说都太棘手了。有输入吗?此代码示例也可能有用:http://www.outlookcode.com/codedetail.aspx?id=1414

2 个答案:

答案 0 :(得分:0)

不容易。您需要考虑重复模式和异常,在代码中显式扩展该系列。

如果可以选择使用Redemption,则其版本RDORecurrencePatternGetOccurrence可以将整数索引(除OOA日期外)作为参数传递,因此您可以建立一个事件数组。

答案 1 :(得分:0)

实际上,我找到了一个效率低下但非常有效的答案,因为您不必关心Outlook可能具有的任何重复规则。首先,任何重复规则都不会更改发生时间,这意味着重复约会在一天中的同一时间点进行。第二

GetOcurrences(DateTime) 

如果给定DateTime上没有AppointmentItem,则会引发异常。

最后,RecurrencePattern为您提供

PatternStartDate

因此,您所要做的就是每天从给定的AppointmentItem开始到PatternStartDate结束,每天进行一次倒退检查。

这是我的实现,当然可以写得更好,但是效果很好:

if (myAppointment.IsRecurring)
{
    Outlook.RecurrencePattern pattern = myAppointment.GetRecurrencePattern();

    bool doContinue = true;
    Outlook.AppointmentItem lastAppointmentItem = null ;

    int currentDay = -1;
    while (doContinue) {
        try
        {
            DateTime currentDate = myAppointment.StartInStartTimeZone.AddDays(currentDay);
            if (currentDate < pattern.PatternStartDate)
            {
                doContinue = false;
                lastAppointmentItem = null;
            }
            else
            {
                lastAppointmentItem = pattern.GetOccurrence(currentDate);
                if (lastAppointmentItem != null)
                {
                    doContinue = false;
                }
                else
                {
                    currentDay -= 1;
                }
            }
        }
        catch (Exception ex)
        {
            currentDay -= 1;
        }

    }
....

可以使用相同的方法来创建所有Orccurence的数组。计算所有时间将花费一些时间,我不知道如何处理开放式序列。但这不是这个stackoverflow项目的问题。