3

C# を使用して Outlook 2010 で複数のカテゴリを作成しようとしています。1 つのカテゴリを作成する実行可能ファイルを正常に生成できますが、コードを追加して 2 番目のカテゴリを作成すると、最初のカテゴリのみが追加され、2 番目のカテゴリは追加されません。最初のカテゴリが存在する場合、2 番目のカテゴリが追加されますが、両方を同時にゼロから作成することはありません。

以下は私のコードです。どんな助けでも大歓迎です。

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 チェックに切り替えて以来、これは問題なく機能しています。睡眠時間をいくつか変えてみましたが、大きな違いはないようです。新しいカテゴリが実際にデータストアに「入る」前に、見通しが何かをする必要があると思います。いずれにせよ、私はこれに多くの時間を費やしたくなかったので、これでうまくいきました。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 に答える