Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Outlook加载项-未调用ItemChange_C#_Event Handling_Vsto_Outlook Addin - Fatal编程技术网

C# Outlook加载项-未调用ItemChange

C# Outlook加载项-未调用ItemChange,c#,event-handling,vsto,outlook-addin,C#,Event Handling,Vsto,Outlook Addin,我正在写一篇展望文章。我需要在任何文件夹中的任何电子邮件更改其标记时(即添加或删除类别时)通知外接程序。我曾想过使用ItemChange事件,但无论我对电子邮件做了什么,都不会触发它—添加类别、标记、移动它,等等 我知道您需要创建一个成员变量并将其设置为MapiFolder.Items,以防止垃圾收集,因为不会对垃圾收集的项目调用事件。但即便如此,这一事件也没有被称为 我的问题是: 1为什么下面的代码中没有调用ItemChange,而我在Outlook中尝试以任何方式更改电子邮件,例如添加类别

我正在写一篇展望文章。我需要在任何文件夹中的任何电子邮件更改其标记时(即添加或删除类别时)通知外接程序。我曾想过使用ItemChange事件,但无论我对电子邮件做了什么,都不会触发它—添加类别、标记、移动它,等等

我知道您需要创建一个成员变量并将其设置为MapiFolder.Items,以防止垃圾收集,因为不会对垃圾收集的项目调用事件。但即便如此,这一事件也没有被称为

我的问题是:

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

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

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();
        }


    }
}

很抱歉,我发现了问题:我没有在子文件夹上重复出现

        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;

            }
或使用完全递归:

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


        }

你只有两个层次的深度。如果你真的需要这个,你需要有一个处理每个文件夹的函数,并为每个文件夹递归调用该函数。