2012-07-23 56 views
5

我正在寫一個Outlook加載項,並且希望在保存後(約會時)使用約會的數據執行某些操作(與此處不相關)。
(我是Outlook-Addins的新手)
所以我發現有一個AfterWrite事件,我可以註冊一個方法。 還有一個ItemLoad事件應用程序Outlook預約後的事件已保存

所以我的第一個Efford是這樣的:

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!"); 
} 

的問題是,我不知道怎麼去約會的數據,引發該事件。 Application.ItemLoad註冊一個獲取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; 
    } 
} 

但事件不會被解僱! 我現在很沮喪

回答

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仍然沒有得到我被刪除的對象。

+0

什麼是您的C#代碼引用的「** Constants.FOLDERNAME **」? 不知道這個常量是指什麼,我不能建立你的代碼。 – 2013-09-17 12:04:04

+2

'私人MAPIFolder GetCalendarFolder() {var app = new Microsoft.Office.Interop.Outlook.Application(); NameSpace nameSpace = app.GetNamespace(「MAPI」); return nameSpace.GetDefaultFolder(OlDefaultFolders.olFolderCalendar); }'**使用此方法獲取默認的Outlook.MAPIFolder對象** – 2014-09-01 09:49:05