#c# #outlook
#c# #outlook
Вопрос:
У меня проблема при попытке создать встречу Outlook с повторением каждые 12 лет. Генерируется исключение, как показано во фрагменте ниже:
var oa = Application.CreateItem(Outlook.OlItemType.olAppointmentItem) as Outlook.AppointmentItem;
oa.Subject = "Test";
oa.Start = new DateTime(2009, 06, 12);
oa.End = new DateTime(2009, 06, 13);
oa.AllDayEvent = true;
oa.ReminderSet = false;
var rp = oa.GetRecurrencePattern();
rp.RecurrenceType = Outlook.OlRecurrenceType.olRecursYearly;
rp.StartTime = DateTime.Parse("2009-06-12");
rp.PatternStartDate = DateTime.Parse("2009-06-12");
rp.EndTime = DateTime.Parse("2009-06-13");
try
{
rp.Interval = 12 * 12; //throws exception
}
catch (COMException ex)
{
//Exception is:
//Exception Type: System.Runtime.InteropServices.COMException
//Error Code: A5120009
//Exception: The recurrence pattern is not valid.
//Source: Microsoft Outlook
//Stack Trace:
// at Microsoft.Office.Interop.Outlook.RecurrencePattern.set_Interval(Int32 Interval)
}
Несколько моментов:
- Я думаю, что документация Microsoft здесь неверна:
Если для параметра RecurrenceType задано значение olRecursYearNth или olRecursYear, свойство Interval указывает количество лет между событиями. Например, интервал, равный 1, указывает на повторяемость каждый год, интервал, равный 2, указывает на повторяемость каждые 2 года и так далее.
Мои эксперименты показывают, что для olRecursYear вам нужно указать интервал в месяцах, поэтому, чтобы добиться повторения каждые 2 года, нужно ввести 24 в поле интервала.
- В графическом интерфейсе Outlook можно указать повторение каждые 12 лет, и если я получу такую встречу в своем коде, я получу 144 (12 * 12) в поле интервала. Проблема в том, чтобы создать такую встречу с нуля в коде C #.
Любая помощь / руководство от гуру Outlook API? Может быть, я что-то неправильно понял из документов Microsoft?
Спасибо за любые ответы!
Комментарии:
1. Какое исключение выдается? Пожалуйста, отредактируйте свой вопрос, чтобы включить (по крайней мере, первые несколько строк) текст исключения.
2. Отредактировано, чтобы добавить больше информации о генерируемом исключении.
3. Я не помню, что Outlook делал в более старых версиях, но на уровне MAPI большой двоичный объект повторения всегда сохранял интервал в месяцах для ежегодных событий.
Ответ №1:
Проверено в Outlook 2013 — точно так же, как Outlook 2016 и 2019, RecurrencePattern.Interval
ожидает и возвращает месяцы, а не годы.
Таким образом, поведение такое же, просто документы неверны.
Комментарии:
1. Да, но вы не можете ввести 144 в поле интервала (12 лет), поскольку генерируется исключение. Как правильно создавать встречи, которые происходят каждые 12 лет?
2. И для проблемы с документацией я открыл проблему здесь: github.com/MicrosoftDocs /…
3. Хммм.. Да, похоже, что 96 (8 лет) — это максимум. Я могу предложить только использовать Redemption — его объект RDOAppointmentItem не имеет этого ограничения.
4. Проблема была обнаружена в проекте с открытым исходным кодом, с которым я работаю, поэтому погашение не является вариантом.