Мне нужно текущее назначение. Если нет текущей встречи, то следующая или даже предыдущая встреча.
Я предполагаю использовать Restrict
для ограничения набора встреч, а затем выбрать либо первое, либо последнее собрание в зависимости от аргумента ограничения (например, Ограничить встречи, заканчивающиеся после текущего времени, или встречи, начинающиеся до текущего времени).
У меня проблемы с строковым фильтром, необходимым в качестве аргумента.
Простой пример VB (пень кода):
myStart = Format(Date, "mm/dd/yyyy hh:mm AMPM")
strRestriction = "[Start] <= '" & myStart & "'"
'Restrict the Items collection
Set oResItems = oItems.Restrict(strRestriction)
'Sort
oResItems.Sort "[Start]"
Я пытаюсь сделать то же самое в C #.
// Create the Outlook application.
Outlook.Application oApp = new Outlook.Application();
// Get the NameSpace and Logon information.
// Outlook.NameSpace oNS = (Outlook.NameSpace)oApp.GetNamespace("mapi");
Outlook.NameSpace oNS = oApp.GetNamespace("mapi");
//Log on by using a dialog box to choose the profile.
oNS.Logon(Missing.Value, Missing.Value, true, true);
// Get the Calendar folder.
Outlook.MAPIFolder oCalendar = oNS.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderCalendar);
// Get the Items (Appointments) collection from the Calendar folder.
oItems = oCalendar.Items;
oItems.IncludeRecurrences = true;
// THIS IS THE PROBLEM AREA
String filter = "[Start] <= '" + DateTime.Now.ToString("MM/dd/yyyy hh:mm AMPM") + "'";
Outlook.Items restrictedItems = oItems.Restrict(filter);
// Take the last item on the list - should be current or next appointment
restrictedItems.Sort("[Start]");
Outlook.AppointmentItem oAppt = restrictedItems.GetLast();
// Done. Log off.
oNS.Logoff();
Я полагаю, поскольку фильтр является строкой, формат даты должен быть гггг / мм / дд ЧЧ: мм: сс? Я не могу найти никакой документации о том, как манипулировать [Start], например, разбирать его на дату или что-то в этом роде.
В зависимости от формата даты я либо получу неправильную встречу, либо не смогу использовать GetLast из-за фильтра, исключающего все встречи.
Я видел примеры, но они либо перебирают встречи (слишком неэффективно), либо форматы даты выглядят так, что им нельзя доверять, чтобы вернуть правильную встречу (например, https://social.msdn.microsoft.com/Forums/vstudio/en-US/c6a8bd21-6534-43be-b23e-1068651da92e/retrieve-appointment-items-from-outlook-2007-calendar-restrict?forum=vsto,, который, кажется, вместо этого используйте жестко закодированную дату, если используете DateTime.Now
.)
ОБНОВЛЕНИЕ: я в настоящее время перебираю, как показано ниже. Любые предложения для более эффективного кода?
DateTime currentTime = DateTime.Now;
foreach (Outlook.AppointmentItem item in oItems)
{
if (item.Start <= currentTime && item.End.Subtract(new TimeSpan(0, 10, 0)) > currentTime)
{
appointmentArrayList.Add(item);
}
}