5

私は Outlook アドインを作成していて、保存された後 (いつ) に予定のデータを使用して何か (ここでは関係ありません) を実行したいと考えています。
(私は Outlook-Addins を初めて使用します)メソッドを登録できるAfterWriteイベントが
あることがわかりました。また、 ApplicationにはItemLoadイベントがあります。

私の最初のエフォードは次のようなものでした:

private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
    // ...
    this.Application.ItemLoad += 
        new Outlook.ApplicationEvents_11_ItemLoadEventHandler(atItemLoad);
}
public void atItemLoad(Object item)
{
    Outlook.AppointmentItem aitem = item as Outlook.AppointmentItem;
    if (aitem != null)
    {
        aitem.AfterWrite += 
            new Outlook.ItemEvents_10_AfterWriteEventHandler(afterWrite);
    }
}
public void afterWrite()
{
    // Who was written?
    MessageBox.Show("it was written!");
}

問題は、イベントを発生させた Appointment のデータにアクセスする方法がわからないことです。 Application.ItemLoadは、 Appointmentにキャストできる Object を取得する関数を登録します。
AfterWriteはありません。私はこのようなものが欲しいです:

public void afterWrite(Outlook.AppointmentItem aitem)
{
    // do something with the data from the Appointment
    MessageBox.Show(aitem.Subject + " was written!");
}

私は完全に間違った方向に研究しているのではないかと心配しています..

*私の英語が混乱していたらごめんなさい - それは私の母国語ではありません

編集:

私もこのような構成を試しました:

private List<AppointmentEventHolder> holderList = new List<AppointmentEventHolder>();

internal class AppointmentEventHolder
{
    private Outlook.AppointmentItem aitem = null;
    public AppointmentEventHolder(Outlook.AppointmentItem item)
    {
        aitem = item;
    }

    public void onWrite()
    {
        MessageBox.Show("write: " + aitem.Subject);
    }
}

public void atItemLoad(Object item)
{
    Outlook.AppointmentItem aitem = item as Outlook.AppointmentItem;
    if (aitem != null)
    {
        AppointmentEventHolder aHolder = new AppointmentEventHolder(aitem);
        holderList.Add(aHolder);
        aitem.AfterWrite += aHolder.onWrite;
    }
}

しかし、イベントは発生しません! 私は今とてもイライラしています

4

1 に答える 1

6

わかりました、私はこれを得たと思います。
予定のあるフォルダーにハンドラーを登録する必要があります。

イベントを登録するオブジェクトへの参照を保存することが重要であることを読んで経験したので、これを行いました。
それがコードです

private Outlook.MAPIFolder _CalendarFolder = null;
private Outlook.Items _CalendarItems = null;

private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
    Outlook.MAPIFolder calendarFolder =
        this.Application.ActiveExplorer().Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderCalendar);

    // get the Termine24-Folder (if not found, create it)
    try
    {
        _CalendarFolder = calendarFolder.Folders[Constants.FOLDERNAME];
    }
    catch
    {
        _CalendarFolder = calendarFolder.Folders.Add(Constants.FOLDERNAME);
    }
    _CalendarItems = _CalendarFolder.Items;
    attachEvents();

}
public void attachEvents()
{
    _CalendarItems.ItemAdd += Item_Add;
    _CalendarItems.ItemChange += Item_Change;
    _CalendarItems.ItemRemove += Item_Remove;
}
public void Item_Add(Object item)
{
    Outlook.AppointmentItem aitem = item as Outlook.AppointmentItem;
    if (aitem != null)
    {
        MessageBox.Show("add: " + aitem.Subject);
    }
    else
    {
        MessageBox.Show("add, but no appointment");
    }
}
public void Item_Change(Object item)
{
    Outlook.AppointmentItem aitem = item as Outlook.AppointmentItem;
    if (aitem != null)
    {
        MessageBox.Show("changed: " + aitem.Subject);
    }
    else
    {
        MessageBox.Show("change, but no appointment");
    }
}
public void Item_Remove()
{
    MessageBox.Show("Item_remove");
}

幸いなことに、予定が概要でドラッグ アンド ドロップされた場合にもイベントが発生するようになりました。

しかし、Item_Remove はまだ削除されたオブジェクトを取得できません。

于 2012-07-26T10:49:38.623 に答える