2012-07-23 53 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