Правильно ли создать повторяющееся исключение AppointmentItem, не меняя тему или текст? - PullRequest
0 голосов
/ 17 июня 2019

Я хочу создать надстройку Outlook, которая изменяет повторяющиеся элементы Outlook AppointmentItems. (этот вид относится к этому вопросу: Невозможно сохранить и извлечь пользовательские ItemProperties из AppointmentItem, если это повторяющийся 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, Subject = "Test" 15.7.2019, Subject = "Test" 22.7.2019, Тема = "Тест"

Теперь пользователь открывает в outlook назначение 15.7.2019. Откуда мне знать, что мне нужно получить исключение [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;
                                    }
                                }
                            }

                        }

Я отладил это, но понял, что для текущего AppointmenhtItem, созданного пользователем, не создано исключение, хотя я вызвал .Save ()? Поэтому я искал способ для Outlook создать исключение для открытого в настоящий момент AppointmentItem, чтобы я мог добавить отдельные данные (например, UserData, конкретный основной текст и т. Д.) К этому элементу назначения, также известному как Exception. Я попытался добавить пробел к теме, тогда это работало отлично !!

Теперь вопрос в том, как я могу изменить текущий AppointmentItem таким образом, чтобы Outlook создавал исключение, не меняя тему и тело?

Более того, ссылки, подобные этим: 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. Таким образом, это решает мою проблему выше?

...