2017-04-14 166 views
3

我給我的一些項目列出一個自定義屬性,並且我想在該屬性更改時執行某個事件。有沒有辦法編寫一個事件處理程序來處理事件olFolderToDo中的所有項目,或者以編程方式向項目中添加事件處理程序,以便在添加新項目時添加事件處理程序?將事件處理程序添加到項目編程

我笨拙地處理了這個問題,把我的代碼放在文件夾的ItemsChange的事件處理程序中,然後檢查屬性的值(例如,當我想在任務被標記時觸發一個動作完成後,我注意物品的變化,然後檢查物品是否標記爲完成),但這並不處理對屬性的任意更改,並且需要仔細處理以避免連續多次發射。什麼我目前做

例子:

Public WithEvents Items As Outlook.Items 

Private Sub Application_Startup() 
Set Items = Application.GetNamespace("MAPI").GetDefaultFolder(olFolderToDo).Items 
End Sub 

Private Sub Items_ItemChange(ByVal Item As Object) 
If TypeOf Item Is Outlook.TaskItem Then 
    If Item.Status = olTaskComplete Then 
     DoTheThing 
    End If 
ElseIf TypeOf Item Is Outlook.MailItem Then 
    If Item.FlagStatus = olFlagComplete Then 
     DoTheThing 
    End If 
End If 
End Sub 

回答

0

當一個項目的自定義屬性(這是父對象的實例)被改變的CustomPropertyChange事件。爲了能夠處理該事件,您必須單獨訂閱Outlook中的每個項目,這不是一個好主意。更好的解決方案是訂閱Items類的ItemChange事件,該事件在指定集合中的項目發生更改時觸發。在這種情況下,您可以監視文件夾,而不是單個文件夾。但它不會告訴你哪個屬性發生了變化。但是,您可以爲同步值保留兩個自定義屬性(第一個用於源屬性值,第二個用於舊值,因此您將能夠確定哪些屬性發生更改,以及舊值是什麼)。

作爲解決方法,您可以考慮使用基於Outlook的低級API - 擴展MAPI。在那裏你可以找到fnevObjectModified通知。有關更多信息,請參閱Event Notification in MAPI。請注意,您可以使用託管代碼中擴展MAPI的任何包裝來訪問低級別通知(例如,Redemption或MAPI Store Accessor)。

+0

爲什麼訂閱每個展望項目單獨是一個壞主意?它會減慢速度嗎? – Empiromancer

+0

當然......您必須儘快釋放COM對象,並避免讓它們始終處於活動狀態。 –

相關問題