我想创建一个Outlook加载项来修改重复的Outlook AppointmentItems。 (与该问题有关:Cannot store and retrieve custom ItemProperties from AppointmentItem in case it is a recurring AppointmentItem)
场景: 用户在其Outlook日历中创建每周定期约会。 现在,当用户打开特定的约会项目(而不是系列!)时,该插件需要将UserData添加到AppointmentItem。
我的插件在非经常性约会项目上完美运行。
我有点理解为什么它不适用于重复的约会项目。关键是,当用户打开重复系列的约会项目时,他不会(!)获得异常(即Outlook不会创建异常)。因此,更改此约会项并最终调用myAppointmentItem.Save()不会保存任何内容,因为它在错误的AppointmentItem实例上进行操作。
无论如何(重复/非重复),我的代码都会先调用“ myAppointment.Save()”,以便为约会创建一个UID(稍后需要)
所以问题是如何在代码中知道我是否正在处理重复的约会项目?
答案可能是:
if (myAppointment.IsRecurring)
{
// do something
}
现在,如果这是一次定期会议,我现在需要代码来创建异常吗? 可能不再需要,因为“ myAppointment.Save()”已经创建了一个异常?看看https://docs.microsoft.com/de-de/office/client-developer/outlook/pia/how-to-create-an-exception-appointment-in-a-recurring-appointment-series意味着只调用Save();会做的工作。也许我没有对当前的AppointmentItem进行任何更改的事实使Outlook认为没有必要创建异常?)
现在问题归结为:如何正确创建并检索当前打开的AppointmentItem的异常?
我尝试过: myAppointment.Save();
if (myAppointment.IsRecurring)
{
Outlook.Exception myException = myAppointment.GetRecurrencePattern().Exceptions[1];
if (myException != null)
{
myAppointment = myException.AppointmentItem;
}
}
示例: 我每周定期约会。比方说 1.7.2019,主题=“测试” 8.7.2019,主题=“测试” 15.7.2019,主题=“测试” 22.7.2019,主题=“测试”
现在用户在Outlook中打开15.7.2019的约会。我怎么知道我需要检索Exception [3]?
因此,我尝试遍历异常:
Outlook.AppointmentItem myAppointment = item as Outlook.AppointmentItem;
DateTime myDate = myAppointment.Start;
if (myAppointment != null)
{
myAppointment.Save(); // if new meeting we need to generate UID if this is a outlook generated appointment
if (myAppointment.IsRecurring)
{
Outlook.Exceptions exceptions = myAppointment.GetRecurrencePattern().Exceptions;
for (int i=1;i<=exceptions.Count;i++)
{
Outlook.Exception myException = myAppointment.GetRecurrencePattern().Exceptions[i];
if (myException != null)
{
myAppointment = myException.AppointmentItem;
if (myDate == myAppointment.Start)
{
break;
}
}
}
}
我对此进行了调试,但是我意识到,尽管我调用了.Save(),但用户打开的当前AppointmenhtItem没有创建任何异常? 因此,在为当前打开的AppointmentItem创建Exception时寻找了一种Outlook的方式,这样我就可以将单个数据(例如UserData,特定的正文文本等)添加到该约会项(又称为Exception)中。 我试图给主题加上一个空格,然后效果很好!!
现在的问题是,如何以一种使Outlook创建Exception而不更改主题和正文的方式更改当前的AppointmentItem?
更多类似这样的链接:https://docs.microsoft.com/de-de/dotnet/api/microsoft.office.interop.outlook.recurrencepattern.getoccurrence?view=outlook-pia说,在C#中工作时,您需要显式释放用于引用RecurrencePattern等的内存。我该怎么做?现在,类Outlook.RecurrencePattern和Outlook.Exceptions上有.Dispose()方法。
RecurrencePattern.GetOccurrence(DateTime)实际做什么?它是否返回所需的Exception.AppointmentItem。因此,它可以解决我上面的问题吗?