VSTO之旅系列(五):建立Outlook解決方案

  本專題概要html

  • 引言
  • Outlook對象模型
  • 自定義Outlook窗體
  • 小結

 

1、引言編程

  在上一個專題中,爲你們簡單介紹了下如何建立Word解決方案的,因此本專題中將爲你們介紹下Outlook相關的內容。咱們從Visual Studio 2010 中Office節點下的模板中咱們能夠看到,Outlook只有外接程序的模板,並無提供像Word或Excel這樣的文檔級的模板,因此VSTO沒有爲Outlook解決方案建立宿主項和宿主控件(Excel和Word中VSTO都爲他們提供了宿主項和宿主控件,由於這些控件是文檔級別的。對於宿主控件和宿主項的具體內容能夠參考本系列的專題一)。爲了可以更好地建立Outlook的解決方案,下面就具體介紹下Outlook對象模型。ide

2、Outlook對象模型this

2.1 Application 對象spa

Application對象表明着Outlook應用程序,而且也是Outlook對象模型裏的頂層對象(這點和Word和Excel是同樣的)。在VSTO項目中要得到該對象的實例一樣能夠經過ThisAddIn類的Application字段來實現,具體代碼爲:Globals.ThisAddIn.Application或This.Application設計

2.2 NameSpace對象code

Application對象的Session屬性返回一個NameSpace對象,Session從字面上看是會話的意思,在Web開發中,咱們能夠從Session對象中得到保存的信息,一樣,咱們能夠經過NameSpace對象來訪問Outlook數據,好比當咱們想得到收件箱裏郵件數量時,此時就能夠用到NameSpace對象,具體代碼以下:orm

  
  
           
  
  
  1. // 得到收件箱文件夾 
  2.             Outlook.MAPIFolder Inbox = this.Application.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox); 
  3.             // 得到收件箱中郵件數量 
  4.             int mailnumbers = Inbox.Items.Count; 

2.3 Explorer對象htm

Explorer對象是顯示Outlook中文件夾內容的窗口。文件夾包含項,例如郵件項,通俗點說,咱們點擊Outlook中的郵件或日曆或聯繫人時,出現的窗口就是一個Explorer對象。對象

2.4 Inspector對象

Inspector對象是顯示Outlook中每一個項(例如單個電子郵件項、單個聯繫人項)的窗口。看到這裏,有些朋友確定會把Explorer對象與Inspector對象弄混淆,相信經過下面的圖你們確定能夠徹底明白二者的區別:

2.5 Outlook文件夾,即MAPIFolder對象

Outlook文件夾用來存儲項(即郵件項,聯繫人項,任務項等),在Outlook中你能夠建立本身的文件夾,然而Outlook中也提供了一些默認的文件夾。上面的這段代碼: this.Application.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox); 就是得到收件箱文件夾,若是你須要得到其餘文件夾,能夠經過改變OlDefaultFolders枚舉值來得到。

2.6 Outlook項

 Outlook裏的項包含在文件夾裏的。咱們能夠經過下面的代碼來建立一個郵件項,若是要得到其餘的Outlook項,能夠經過修改Outlook.OlItemType枚舉值來實現

 // 建立郵件項
            Outlook.MailItem mailItem = (Outlook.MailItem)this.Application.CreateItem(Outlook.OlItemType.olMailItem);

3、自定義Outlook窗體

  介紹了Outlook的這麼多對象的,你們確定很火燒眉毛地想知道使用VSTO的技術能夠爲Outlook實現什麼樣的功能呢?下面就用VSTO的技術來自定義Outlook的聯繫人窗體,在不少時候,咱們都但願聯繫人的窗體中有關於父母的聯繫方式,而後在現有的Outlook界面中卻沒有這樣的字段來給咱們填寫的,因此這裏經過Form Region 的方式來實現自定義聯繫人窗體,咱們須要在聯繫人窗體中加入輸入父母姓名和聯繫方式的控件。

首先,咱們須要建立Outlook窗體區域,建立步驟以下:

  1. 右鍵項目,選擇添加——>新建項目——>Outlook窗體區域
  2. 選擇」設計新的窗體區域「選項

  3. 窗體區域類型選擇相鄰,即把自定義的窗體附加到頁面的底部。

4. 爲窗體區域輸入一個名字,而且設定在編輯模和閱讀模式和中都顯示窗體區域。

  5. 把咱們的窗體區域嵌入在聯繫人窗體中。

徹底以上一系列的步驟以後,VS會幫咱們自動建立一個空的窗體區域,若是咱們想修改剛纔建立的窗體區域的設置,咱們能夠經過它的屬性窗口中進行修改。

建立完窗體區域以後,咱們就須要在窗體區域中添加咱們須要自定義的控件了,這裏的設計界面以下:

設計完界面以後,最後就是實現咱們的後臺邏輯了,即在後臺寫代碼來完成咱們所須要實現的功能。具體後臺代碼以下(由於代碼註釋中都有解釋,你們不懂實現過程能夠看代碼註釋):

  
  
           
  
  
  1. // 對應的聯繫人(Contact)對象 
  2.         private Outlook.ContactItem contactItem; 
  3.          
  4.         // 自定義屬性對象 
  5.         private Outlook.ItemProperty MotherName = null
  6.         private Outlook.ItemProperty MotherTelNumber = null
  7.         private Outlook.ItemProperty FatherName = null
  8.         private Outlook.ItemProperty FatherTelNumber = null
  9.  // 在顯示窗體區域以前發生。 
  10.         // 使用 this.OutlookItem 獲取對當前 Outlook 項的引用。 
  11.         // 使用 this.OutlookFormRegion 獲取對窗體區域的引用。 
  12.         private void ContactFormRegion_FormRegionShowing(object sender, System.EventArgs e) 
  13.         { 
  14.             // 得到FormRegion所對應的Contact對象 
  15.             contactItem = this.OutlookItem as Outlook.ContactItem; 
  16.  
  17.             // 在從自定義屬性中取出值時,首先確保自定義屬性不爲空。 
  18.             EnsureProperties(); 
  19.  
  20.             // 從聯繫人的自定義屬性中取出值爲控件賦值 
  21.             txbMotherName.Text = MotherName.Value; 
  22.             txbFatherName.Text = FatherName.Value; 
  23.             txbMotherTel.Text = MotherTelNumber.Value; 
  24.             txbFatherTel.Text = FatherTelNumber.Value; 
  25.         } 
  26.  
  27.         // 在關閉窗體區域時發生。 
  28.         // 使用 this.OutlookItem 獲取對當前 Outlook 項的引用。 
  29.         // 使用 this.OutlookFormRegion 獲取對窗體區域的引用。 
  30.         private void ContactFormRegion_FormRegionClosed(object sender, System.EventArgs e) 
  31.         { 
  32.             // 釋放對象 
  33.             System.Runtime.InteropServices.Marshal.FinalReleaseComObject(contactItem); 
  34.             contactItem = null
  35.         } 
  36.  
  37.         // 確保全部自定義屬性不爲空 
  38.         private void EnsureProperties() 
  39.         { 
  40.             EnsureItemProperty(ref MotherName, "montherName", Outlook.OlUserPropertyType.olText); 
  41.             EnsureItemProperty(ref FatherName, "fatherName", Outlook.OlUserPropertyType.olText); 
  42.             EnsureItemProperty(ref MotherTelNumber, "motherTelNumber", Outlook.OlUserPropertyType.olText); 
  43.             EnsureItemProperty(ref FatherTelNumber, "fatherTelNumber", Outlook.OlUserPropertyType.olText); 
  44.         } 
  45.  
  46.         // 確保項目屬性不爲空引用 
  47.         private void EnsureItemProperty(ref Outlook.ItemProperty property, string name, Outlook.OlUserPropertyType propertyType) 
  48.         { 
  49.             // 若是自定義屬性爲空時 
  50.             // 首先從聯繫人項關聯的屬性集合中得到屬性對象 
  51.             // 若是項目集合中還不存在該屬性時,就把該屬性名稱添加進ItemProperties集合中 
  52.             if (property == null
  53.             { 
  54.                 property = contactItem.ItemProperties[name]; 
  55.                 if (property == null
  56.                 { 
  57.                     property = contactItem.ItemProperties.Add(name, propertyType); 
  58.                 } 
  59.             } 
  60.         } 
  61.  
  62.         // 父親名字修改事件 
  63.         private void txbFatherName_TextChanged(object sender, EventArgs e) 
  64.         { 
  65.             // 保存值到自定義的屬性中 
  66.             FatherName.Value = txbFatherName.Text; 
  67.         } 
  68.  
  69.         // 父親的電話號碼修改事件 
  70.         private void txbFatherTel_TextChanged(object sender, EventArgs e) 
  71.         { 
  72.             // 保存值到自定義的屬性中 
  73.             FatherTelNumber.Value = txbFatherTel.Text; 
  74.         } 
  75.  
  76.         // 母親名字修改事件 
  77.         private void txbMotherName_TextChanged(object sender, EventArgs e) 
  78.         { 
  79.             // 保存值到自定義的屬性中 
  80.             MotherName.Value = txbMotherName.Text; 
  81.         } 
  82.  
  83.         // 母親的電話號碼修改事件 
  84.         private void txbMotherTel_TextChanged(object sender, EventArgs e) 
  85.         { 
  86.             // 保存值到自定義的屬性中 
  87.             MotherTelNumber.Value = txbMotherTel.Text; 
  88.         } 

從上面的代碼中能夠看出,主要的實現思路是——初始化聯繫人窗口,從自定義屬性中獲取值來初始化窗體中控件的值,若是自定義屬性不存在時,此時就須要把自定義屬性添加進ItemProperties集合中來確保自定義屬性不爲空,若是自定義屬性存在,則直接中自定義屬性中獲取值來初始化窗體中的控件。最後註冊窗體中每一個控件的修改事件,把控件中值的修改保存到自定義屬性中,這樣以便下次打開聯繫人時能夠得到修改過的數據

這樣咱們的設計就完成了,接下來看看程序的運行結果吧(按F5 運行該程序):

運行出現的第一個窗口爲:

點擊新建聯繫人以後,出現編輯聯繫人窗體,此時在窗體中能夠看到咱們自定義的窗體:

輸入聯繫人的相關信息,點擊保存並關閉按鈕,而後咱們再打開該聯繫人,修改"父親電話"爲 」123456「(以前是123456789),點擊保存並關閉按鈕,當咱們下次再打開該聯繫人時,此時能夠得到修改後的數據信息:

這樣就成功完成了咱們開始所說的需求,固然這個還有不少不足的地方,好比沒有對電話號碼進行驗證(如在電話號碼文本框中輸入中文或者不存在的號碼,或者不是11位的號碼等狀況進行討論)。

4、小結

  到這裏,本專題的內容就介紹完了,但願經過本專題能夠幫助你們理解如何用VSTO技術來自定義咱們的Outlook窗體和咱們的Outlook界面(自定義Outlook界面和自定義Excel界面很相似,具體操做能夠參考專題三)。在下一個專題中將爲你們介紹如何實現Office的自動化編程。

相關文章
相關標籤/搜索