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