本專題概要html
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
- // 得到收件箱文件夾
- Outlook.MAPIFolder Inbox = this.Application.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox);
- // 得到收件箱中郵件數量
- 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窗體區域,建立步驟以下:
3. 窗體區域類型選擇相鄰,即把自定義的窗體附加到頁面的底部。
4. 爲窗體區域輸入一個名字,而且設定在編輯模和閱讀模式和中都顯示窗體區域。
5. 把咱們的窗體區域嵌入在聯繫人窗體中。
徹底以上一系列的步驟以後,VS會幫咱們自動建立一個空的窗體區域,若是咱們想修改剛纔建立的窗體區域的設置,咱們能夠經過它的屬性窗口中進行修改。
建立完窗體區域以後,咱們就須要在窗體區域中添加咱們須要自定義的控件了,這裏的設計界面以下:
設計完界面以後,最後就是實現咱們的後臺邏輯了,即在後臺寫代碼來完成咱們所須要實現的功能。具體後臺代碼以下(由於代碼註釋中都有解釋,你們不懂實現過程能夠看代碼註釋):
- // 對應的聯繫人(Contact)對象
- private Outlook.ContactItem contactItem;
- // 自定義屬性對象
- private Outlook.ItemProperty MotherName = null;
- private Outlook.ItemProperty MotherTelNumber = null;
- private Outlook.ItemProperty FatherName = null;
- private Outlook.ItemProperty FatherTelNumber = null;
- // 在顯示窗體區域以前發生。
- // 使用 this.OutlookItem 獲取對當前 Outlook 項的引用。
- // 使用 this.OutlookFormRegion 獲取對窗體區域的引用。
- private void ContactFormRegion_FormRegionShowing(object sender, System.EventArgs e)
- {
- // 得到FormRegion所對應的Contact對象
- contactItem = this.OutlookItem as Outlook.ContactItem;
- // 在從自定義屬性中取出值時,首先確保自定義屬性不爲空。
- EnsureProperties();
- // 從聯繫人的自定義屬性中取出值爲控件賦值
- txbMotherName.Text = MotherName.Value;
- txbFatherName.Text = FatherName.Value;
- txbMotherTel.Text = MotherTelNumber.Value;
- txbFatherTel.Text = FatherTelNumber.Value;
- }
- // 在關閉窗體區域時發生。
- // 使用 this.OutlookItem 獲取對當前 Outlook 項的引用。
- // 使用 this.OutlookFormRegion 獲取對窗體區域的引用。
- private void ContactFormRegion_FormRegionClosed(object sender, System.EventArgs e)
- {
- // 釋放對象
- System.Runtime.InteropServices.Marshal.FinalReleaseComObject(contactItem);
- contactItem = null;
- }
- // 確保全部自定義屬性不爲空
- private void EnsureProperties()
- {
- EnsureItemProperty(ref MotherName, "montherName", Outlook.OlUserPropertyType.olText);
- EnsureItemProperty(ref FatherName, "fatherName", Outlook.OlUserPropertyType.olText);
- EnsureItemProperty(ref MotherTelNumber, "motherTelNumber", Outlook.OlUserPropertyType.olText);
- EnsureItemProperty(ref FatherTelNumber, "fatherTelNumber", Outlook.OlUserPropertyType.olText);
- }
- // 確保項目屬性不爲空引用
- private void EnsureItemProperty(ref Outlook.ItemProperty property, string name, Outlook.OlUserPropertyType propertyType)
- {
- // 若是自定義屬性爲空時
- // 首先從聯繫人項關聯的屬性集合中得到屬性對象
- // 若是項目集合中還不存在該屬性時,就把該屬性名稱添加進ItemProperties集合中
- if (property == null)
- {
- property = contactItem.ItemProperties[name];
- if (property == null)
- {
- property = contactItem.ItemProperties.Add(name, propertyType);
- }
- }
- }
- // 父親名字修改事件
- private void txbFatherName_TextChanged(object sender, EventArgs e)
- {
- // 保存值到自定義的屬性中
- FatherName.Value = txbFatherName.Text;
- }
- // 父親的電話號碼修改事件
- private void txbFatherTel_TextChanged(object sender, EventArgs e)
- {
- // 保存值到自定義的屬性中
- FatherTelNumber.Value = txbFatherTel.Text;
- }
- // 母親名字修改事件
- private void txbMotherName_TextChanged(object sender, EventArgs e)
- {
- // 保存值到自定義的屬性中
- MotherName.Value = txbMotherName.Text;
- }
- // 母親的電話號碼修改事件
- private void txbMotherTel_TextChanged(object sender, EventArgs e)
- {
- // 保存值到自定義的屬性中
- MotherTelNumber.Value = txbMotherTel.Text;
- }
從上面的代碼中能夠看出,主要的實現思路是——初始化聯繫人窗口,從自定義屬性中獲取值來初始化窗體中控件的值,若是自定義屬性不存在時,此時就須要把自定義屬性添加進ItemProperties集合中來確保自定義屬性不爲空,若是自定義屬性存在,則直接中自定義屬性中獲取值來初始化窗體中的控件。最後註冊窗體中每一個控件的修改事件,把控件中值的修改保存到自定義屬性中,這樣以便下次打開聯繫人時能夠得到修改過的數據。
這樣咱們的設計就完成了,接下來看看程序的運行結果吧(按F5 運行該程序):
運行出現的第一個窗口爲:
點擊新建聯繫人以後,出現編輯聯繫人窗體,此時在窗體中能夠看到咱們自定義的窗體:
輸入聯繫人的相關信息,點擊保存並關閉按鈕,而後咱們再打開該聯繫人,修改"父親電話"爲 」123456「(以前是123456789),點擊保存並關閉按鈕,當咱們下次再打開該聯繫人時,此時能夠得到修改後的數據信息:
這樣就成功完成了咱們開始所說的需求,固然這個還有不少不足的地方,好比沒有對電話號碼進行驗證(如在電話號碼文本框中輸入中文或者不存在的號碼,或者不是11位的號碼等狀況進行討論)。
4、小結
到這裏,本專題的內容就介紹完了,但願經過本專題能夠幫助你們理解如何用VSTO技術來自定義咱們的Outlook窗體和咱們的Outlook界面(自定義Outlook界面和自定義Excel界面很相似,具體操做能夠參考專題三)。在下一個專題中將爲你們介紹如何實現Office的自動化編程。