我正在尝试使用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; }
}
}
}
答案 0 :(得分: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; }
}
}
}
答案 1 :(得分:0)
已经提供的答案并没有为我做到这一点。添加和删除类别时,我仍然会得到不稳定的结果。通过尝试添加/删除,然后重新获取类别并循环直到根据需要添加/删除项目,我能够解决这个问题。
以下是从LinqPad剪切的代码,我将删除所有类别,添加回自己的类别,然后列出一些类别及其值。由于我切换到while / loop检查,这没有问题。我尝试了几个不同的睡眠时间,似乎并没有太大的区别。我猜测在新类别实际“进入”数据存储区之前,必须先做一些前景。无论如何,我不想花很多时间在这上面,这对我有用。我在Windows 7上使用outlook 2010。不确定新版本的办公室是否有同样的问题。
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();
}