2012-09-17 101 views
3

我正嘗試使用C#在Outlook 2010中創建多個類別。我能夠成功生成一個可執行文件,它將創建一個類別,但是當我添加代碼以創建第二個類別時,它仍然只會添加第一個而不是第二個。如果第一個類別存在,它將添加第二個類別,但它不會同時從頭開始創建。以編程方式向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

只是想碰這個 - 因爲我剛剛經歷過同樣的問題...... – Drammy

回答

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

} 
相關問題