首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Outlook加载项-未调用ItemChange

Outlook加载项-未调用ItemChange
EN

Stack Overflow用户
提问于 2014-02-20 00:32:46
回答 1查看 513关注 0票数 1

我正在写一个Outlook加载项。我需要通知插件时,任何电子邮件,在任何文件夹,改变其标签(即当一个类别是添加或删除)。我想过使用ItemChange事件(link),但无论我对电子邮件做什么(添加类别、标志、移动它等等),它都不会被触发。

我知道您需要创建一个成员变量并将其设置为MapiFolder.Items,以防止垃圾收集,因为不会在垃圾收集项上调用事件。但即便如此,该事件仍未被调用。

我的问题是:

1)当我在Outlook中尝试以任何方式更改电子邮件(例如,添加类别)时,为什么在下面的代码中没有调用ItemChange?

2)对于给定的电子邮件,应该在什么时候调用ItemChange事件?

代码语言:javascript
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
using Outlook = Microsoft.Office.Interop.Outlook;
using Office = Microsoft.Office.Core;

namespace TestOutlookAddIn1
{
    public partial class ThisAddIn
    {

        List<Outlook.Items> mItems = new List<Outlook.Items>();

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

            var fo = Application.Session.Folders;
            foreach (Outlook.Folder f in fo)
            {
                var items = f.Items;
                mItems.Add(items);  // prevent garbage collection
                items.ItemChange += Items_ItemChange;
                items.ItemAdd += items_ItemAdd;
                items.ItemRemove += items_ItemRemove;


            }
        }

        void items_ItemRemove()
        {
            throw new NotImplementedException();
        }

        void items_ItemAdd(object Item)
        {
            throw new NotImplementedException();
        }

        void Items_ItemChange(object Item) // NOT BEING CALLED <<<<<
        {
            throw new NotImplementedException();
        }


    }
}
EN

回答 1

Stack Overflow用户

发布于 2014-02-20 00:42:51

对不起,我发现了问题:我没有在子文件夹上重复出现。

代码语言:javascript
复制
        var fo = Application.Session.Folders;
        foreach (Outlook.Folder f in fo)
        {

            foreach (Outlook.Folder f2 in f.Folders)
            {

                var items = f2.Items;
                mItems.Add(items);
                items.ItemChange += Items_ItemChange;
                items.ItemAdd += items_ItemAdd;
                items.ItemRemove += items_ItemRemove;

            }

或者使用完全递归:

代码语言:javascript
复制
var frontier = new Queue<Folder>();
foreach (Folder f in lSession.Folders)
{
    frontier.Enqueue(f);
}

while (frontier.Any())
{
    var curFolder = frontier.Dequeue();
    curFolder.Items.ItemChange += Items_ItemChange;

    foreach (Folder ch in curFolder.Folders)
    {
        frontier.Enqueue(ch);
    }
}


        }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21886574

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档