2

予定が保存されたことを通知し、いくつかのデータを処理するアドインを作成しようとしています。そのためには、アクティブなインスペクターを閉じたときにアイテムが保存されるかどうかを確認する必要があります。

WriteEvent私の問題はこれです:-メソッドで-listenerを現在のアイテムにバインドしようとすると、 toイベントで現在のアイテムを取得するFormRegionShowing必要があります。ActiveInspectorただし、ActiveInspectorそこに到達するとnull、おそらく、アクティブなインスペクターが実際にアクティブになる前にそのメソッドが呼び出されるためです。

ただし、-methodでバインドしようとするとFormRegionClosed、writeイベントが発生することはありません。AppointmentItemでは、ユーザーが実際にいつ保存したかを知るにはどうすればよいですか?

編集:-メソッドで書き込みイベントをバインドできましたFormRegionShowingが、それでも発生しません:

private void ADDIN_NAME_FormRegionShowing(object sender, System.EventArgs e){

    Outlook.AppointmentItem currentItem = (Outlook.AppointmentItem)this.OutlookItem;

    currentItem.Write += new Outlook.ItemEvents_10_WriteEventHandler(currentItem_Write);

    currentItem.AfterWrite += new Outlook.ItemEvents_10_AfterWriteEventHandler(currentItem_AfterWrite);

    MessageBox.Show("added handlers");

}

void currentItem_AfterWrite(){
    MessageBox.Show("item has been saved");
}

void currentItem_Write(ref bool Cancel){
    MessageBox.Show("item being saved");
}
4

1 に答える 1

4

Outlook.AppointmentItemクラスレベルの変数に移動する必要があります。COMでは、関数がスコープ外になると、RCWはガベージコレクションされます。Officeでイベントを使用する場合は、イベントモデルを確認する必要があります。関連するSO投稿も参照してください。

private Outlook.AppointmentItem currentItem; // keep events from getting GC'd

private void ADDIN_NAME_FormRegionShowing(object sender, System.EventArgs e){
    currentItem = (Outlook.AppointmentItem)this.OutlookItem;
    currentItem.Write += new Outlook.ItemEvents_10_WriteEventHandler(currentItem_Write);
    currentItem.AfterWrite += new Outlook.ItemEvents_10_AfterWriteEventHandler(currentItem_AfterWrite);
}
于 2012-06-07T13:04:37.930 に答える