VSTO Outlook Plugin: Не удается получить AppointmentItem в событии Item_Change, когда повторяющаяся встреча перетаскивается пользователем - PullRequest
0 голосов
/ 24 февраля 2020

Я хочу перехватить событие изменения в AppointmentItem. Я использую Outlook 2017 для тестов. Для достижения этого я использую:

Я прикрепил события следующим образом:

 public void AttachEvents()
        {
            _CalendarItems.ItemAdd += Item_Add;
            _CalendarItems.ItemChange += Item_Change;
            _DeletedItems.ItemAdd += Item_Delete_Add;

Метод Item_Change выглядит следующим образом:

 public void Item_Change(Object item)
        {
            if (item != null && item is Outlook.AppointmentItem)
            {
                Outlook.AppointmentItem myAppointment = item as Outlook.AppointmentItem;

Для проверки кода я создал повторяющиеся встречи серии. Я дважды щелкнул по встрече в календаре, ввел заголовок и текст и сохранил. Теперь я запустил свой код и осмотрел предмет. К сожалению, элемент указывает на серию, а НЕ на отдельную встречу, когда инициируется изменение элемента. Как я могу получить фактический AppointmentItem, когда инициируется Item_Changed?

Связанное размещение Stackoverflow: Outlook Addin: Перемещение Встречи в Календаре не отражает новую дату / время в AppointmentItem (поймать Calendar.ItemChange) Но все еще нет решения этой

Подробнее об этой топи c:

Ответы [ 2 ]

0 голосов
/ 13 апреля 2020

Для этого есть хитрое решение. Предположение: пользователь использует представление календаря для изменения элемента. Поскольку событие генерируется представлением календаря, это должно быть верно во всех случаях:

_CalendarItems = calendarFolder.Items;
_CalendarItems.ItemChange += Item_Change;

[...] теперь мы можем использовать CalendarView для вычисления выбранной начальной даты и сравнения ее со всеми исключениями, хранящимися в the RecurrencePattern ...

if (myAppointment.IsRecurring) {// в случае повторяющихся встреч в этой точке мы всегда получаем // только ссылку на мастера серии, а НЕ вхождение
// Предположение: Пользователь щелкнул элемент AppointmentItem в представлении календаря // Таким образом, мы можем вычислить выбранное время начала из этого диапазона выбора //, а затем сравнить его со всеми исключениями в OccurrencePattern повторяющегося шаблона //, если мы обнаружим один AppointmentItem в исключениях, которые имеет тот же DateTime, то мы нашли правильный. // Outlook.Application application = new Outlook.Application (); Outlook.Explorer explorer = application.ActiveExplorer (); Папка Outlook.Folder = explorer.CurrentFolder как Outlook.Folder; Outlook.View view = explorer.CurrentView as Outlook.View;

                        // get the current calendar view
                        if (view.ViewType == Outlook.OlViewType.olCalendarView)
                        {
                            Outlook.CalendarView calView = view as Outlook.CalendarView;
                            Outlook.RecurrencePattern pattern = myAppointment.GetRecurrencePattern();

                            for (int i = 1; i <= pattern.Exceptions.Count; i++)
                            {
                                Outlook.Exception myException = pattern.Exceptions[i];
                                Outlook.AppointmentItem exceptionItem = myException.AppointmentItem;
                                DateTime itemDateStart = exceptionItem.Start;
                                if (itemDateStart == calView.SelectedStartTime)
                                {
                                    updateMyPluginMeeting(exceptionItem);
                                    return; // the use may only select on AppointmentItem so we can skip the rest
                                }
                            }
                        }

                    }

Если вы знаете какое-либо лучшее решение для этого, дайте мне знать.

0 голосов
/ 24 февраля 2020

Исключения не являются фактическими встречами - они хранятся в виде вложенных сообщений в основных встречах. Вы получаете назначение мастера, и вам нужно будет получить доступ к его исключениям, чтобы увидеть, что изменилось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...