【问题标题】:Event after a Outlook Appointment was saved保存 Outlook 约会后的事件
【发布时间】:2012-07-21 13:42:16
【问题描述】:

我正在编写 Outlook 加载项,并希望在保存约会后(何时)使用约会数据做一些事情(此处不相关)。
(我是 Outlook 插件的新手)
所以我发现有一个 AfterWrite 事件,我可以在其中注册一个方法。 Application 上有一个 ItemLoad 事件。

所以我的第一个 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 注册了一个获取对象的函数,该对象可以转换为 Appointment
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;
    }
}

但事件不会被触发! 我现在很沮丧

【问题讨论】:

    标签: c# .net events outlook-addin


    【解决方案1】:

    好的,我想我明白了。
    您必须在包含您的约会的文件夹上注册一个处理程序。

    我自己阅读并体验过,保存对您注册事件的对象的引用至关重要,所以我这样做了。
    这就是代码

    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 仍然没有让我得到被移除的对象。

    【讨论】:

    • 您的 C# 代码引用的“Constants.FOLDERNAME”是什么?在不知道这个常量指的是什么的情况下,我无法构建您的代码。
    • private MAPIFolder GetCalendarFolder() { var app = new Microsoft.Office.Interop.Outlook.Application(); NameSpace nameSpace = app.GetNamespace("MAPI"); return nameSpace.GetDefaultFolder(OlDefaultFolders.olFolderCalendar); } 使用此方法获取默认的 Outlook.MAPIFolder 对象
    • ItemRemove 事件不可能为您提供该项目,因为在事件触发时,该项目已经消失。您最好的做法是使用 Redemption 及其 RDOItems.ItemRemove 事件 - 它至少传递 PR_INSTANCE_KEY 属性的值。如果您之前创建了 PR_INSTANCE_KEY 字典以及您感兴趣的其他属性,则可以使用它来查找项目的条目 ID 等。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多