3

我正在尝试使用 C# 在 Outlook 2010 中创建多个类别。我能够成功生成将创建一个类别的可执行文件,但是当我添加代码以创建第二个类别时,它仍然只会添加第一个而不是第二个。如果第一个类别存在,它将添加第二个类别,但不会同时从头开始创建两者。

下面是我的代码。任何帮助是极大的赞赏。

using System;
using System.Linq;
using Outlook = Microsoft.Office.Interop.Outlook;
using Microsoft.Office.Interop.Outlook;


namespace OutlookCategory
{
    class Program
    {
        static void Main(string[] args)
        {
            AddACategory();
        }

        private static void AddACategory()
        {
            var app = new Application();
            Outlook.Categories categories = app.Session.Categories;
            if (!CategoryExists("TEST 1", app))
            {
                categories.Add("TEST 1", Outlook.OlCategoryColor.olCategoryColorDarkBlue);
            }
            if (!CategoryExists("TEST 2", app))
            {
                categories.Add("TEST 2", Outlook.OlCategoryColor.olCategoryColorDarkBlue);
            }

        }

        private static bool CategoryExists(string categoryName, Application app)
        {
            try
            {
                Outlook.Category category =
                    app.Session.Categories[categoryName];
                if (category != null)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            catch { return false; }
        }
    }
}
4

2 回答 2

0

我最终通过创建一个带有我的类别名称及其相关类别颜色的管道分隔文本文件来完成此操作。

然后,我循环浏览了在 Outlook 中创建所有类别的文本文件。

using System;
using System.IO;
using Microsoft.Office.Interop.Outlook;
using Outlook = Microsoft.Office.Interop.Outlook;


namespace OutlookCategory
{
    class Program
    {
        static void Main(string[] args)
        {
            AddACategory();
        }
        private static void AddACategory()
        {
            string[] lines = File.ReadAllLines(@"C:\CategoryList.txt");
            var app = new Application(); 
            foreach (string line in lines)
            {
                string[] LineArray = line.Split('|');                               
                var color = LineArray[1];

                Outlook.Categories categories = app.Session.Categories;
                //Add categories
                if (CategoryExists(LineArray[0], app) == false)
                {
                    categories.Add(LineArray[0], color);
                }
            }
        }
        private static bool CategoryExists(string categoryName, Application app)
        {
            try
            {
                Outlook.Category category =
                    app.Session.Categories[categoryName];
                if (category != null)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            catch { return false; }
        }
    }
}
于 2012-11-02T17:40:37.260 回答
0

已经提供的答案对我没有帮助。在添加和删除类别时,我仍然会得到参差不齐的结果。我可以通过尝试添加/删除来解决这个问题,然后重新获取类别并循环直到根据需要添加/删除项目。

这是从 LinqPad 截取的代码,我将在其中删除所有类别,添加回我自己的类别,然后列出一些类别及其值。自从我切换到 while/loop 检查以来,这一直没有问题。我尝试了几个不同的睡眠时间,似乎并没有太大的不同。我猜在新类别真正“进入”数据存储之前,outlook 必须做一些事情。无论如何,我不想在这上面花费大量时间,这对我有用。我在 Windows 7 上使用 Outlook 2010。不确定新版本的 Office 是否有同样的问题。

void Main()
{

    //using Microsoft.Office.Interop.Outlook
    Application oApp = new Application();
    NameSpace oSes = oApp.Session;
    Categories oCats = oSes.DefaultStore.Categories;

    //remove existing categories
    var catids = (from a in oCats.Cast<Category>() select a.CategoryID).ToArray();
    for (int i = 0; i < catids.Count(); i++)
    {
        var cid = catids[i];
        cid.Dump();
        while(oCats[cid] != null)
        {
            oCats.Remove(cid);
            oCats = oSes.DefaultStore.Categories;
            Thread.Sleep(100);
        }
    }

    //dictionary to hold my categories
    Dictionary<string,OlCategoryColor> dCats = new Dictionary<string,OlCategoryColor>();
    dCats.Add("Category One",OlCategoryColor.olCategoryColorRed);
    dCats.Add("Category Two",OlCategoryColor.olCategoryColorOrange);
    dCats.Add("Category Three",OlCategoryColor.olCategoryColorPeach);
    dCats.Add("Category Four",OlCategoryColor.olCategoryColorYellow);

    foreach (var dCat in dCats)
    {
        var cid = dCat.Key;
        cid.Dump();
        while(oCats[cid] == null)
        {
            oCats.Add(cid,dCat.Value);
            oCats = oSes.DefaultStore.Categories;
            Thread.Sleep(100);
        }
    }

    //show categories
    var cats = from c in oCats.Cast<Category>() select new {
        c.CategoryBorderColor,
        c.CategoryGradientBottomColor,
        c.CategoryGradientTopColor,
        c.CategoryID,
        c.Class,
        c.Color,
        c.Name,
        c.ShortcutKey
    };
    cats.Dump();

}
于 2013-10-03T02:03:58.617 回答