Я работаю над надстройкой Outlook, которая будет сохранять пользовательские свойства клиента в назначении Outlook. Я могу получить ссылку на существующую встречу, используя событие selectionChange.
public partial class ThisAddIn
{
Outlook.Explorer currentExplorer = null;
private Outlook.AppointmentItem appointmentItem = null;
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
currentExplorer = this.Application.ActiveExplorer();
currentExplorer.SelectionChange += new Outlook.ExplorerEvents_10_SelectionChangeEventHandler(CurrentExplorer_Event);
}
private void CurrentExplorer_Event()
{
String expMessage = "default";
try
{
if (this.Application.ActiveExplorer().Selection.Count > 0)
{
Object selObject = this.Application.ActiveExplorer().Selection[1];
if (selObject is Outlook.AppointmentItem)
{
appointmentItem = (selObject as Outlook.AppointmentItem);
expMessage = "The item is an appointment. The subject is " + appointmentItem.Subject + ".";
MessageBox.Show(expMessage);
}
}
}
catch (Exception ex)
{
expMessage = "Error happened " + ex.Message;
}
}
Однако, когда пользователь инициирует новую встречу, this.Application.ActiveExplorer().Selection.Count
равно 0.
Я хотел посмотреть, как мы можем получить ссылку на Outlook AppointmentItem, который был запущен пользователем и еще не был сохранен.
Вот как я смог понять решение. Приведенный выше код отлично работает, когда открыта существующая встреча.
Для новой встречи вы можете использовать ActiveInspector, чтобы получить ссылку на новый AppointmentItem.
Outlook.AppointmentItem appointment = null;
Outlook.Inspector inspector = Globals.ThisAddIn.Application.ActiveInspector();
if (inspector.CurrentItem is Outlook.AppointmentItem)
appointment = inspector.CurrentItem as Outlook.AppointmentItem;
Вы можете использовать либо событие Inspectors.NewInspector
, когда отображается новая новая встреча, либо событие Items.ItemAdd
в папке MAPIFolder
, соответствующей папке календаря, после сохранения новой встречи.
Вы пытаетесь смешивать разные окна Outlook (инспекторы и проводники), чтобы получить туда элементы. Если вам нужно получить элемент, когда пользователь создает новый элемент встречи, вам необходимо обработать событие новый инспектор, которое запускается всякий раз, когда открывается новое окно инспектора, либо в результате действия пользователя, либо через программный код. Вы можете различать существующие элементы и новые, проверив свойство EntryID
, которое возвращает пустую строку в случае новых элементов. Значение свойства EntryID
устанавливается при сохранении элемента в магазине.
Таким образом, нет необходимости обрабатывать событие SelectionChange, которое запускается, когда пользователь выбирает другой или дополнительный элемент Microsoft Outlook программно или посредством взаимодействия с пользовательским интерфейсом. Это событие также происходит, когда пользователь (программно или через пользовательский интерфейс) щелкает или переключается на другую папку, содержащую элементы, поскольку Outlook автоматически выбирает первый элемент в этой папке.
class Connect
{
// Connect class-level Instance Variables
// Outlook inspectors collection
private Outlook.Inspectors inspectors;
public Connect(Outlook.Inspectors Inspectors)
{
inspectors = Inspectors;
// Hook up NewInspector event
inspectors.NewInspector += new
Outlook.InspectorsEvents_NewInspectorEventHandler(
inspectors_NewInspector);
}
// NewInspector event creates new instance of OutlookInspector
void inspectors_NewInspector(Outlook.Inspector Inspector)
{
// use the CurrentItem to get the item object
// inspector.CurrentItem
}
}
Таким образом, нет необходимости использовать свойство ActiveInspector
.
Вам может быть полезна статья Реализуйте оболочку для инспекторов и отслеживайте события на уровне элементов в каждом инспекторе..
Не совсем правильно. Нет необходимости смешивать событие исследователя
SelectionChange
и инспекторов.