我目前正在为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
答案 0 :(得分:0)
不容易。您需要考虑重复模式和异常,在代码中显式扩展该系列。
如果可以选择使用Redemption,则其版本RDORecurrencePattern。GetOccurrence
可以将整数索引(除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项目的问题。