正确创建重复的AppointmentItem异常而不更改主题或正文吗?

时间:2019-06-17 08:10:52

标签: outlook-addin

我想创建一个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。因此,它可以解决我上面的问题吗?

0 个答案:

没有答案