2011-11-03 2 views
3

Je suis en train de brancher une méthode avec l'événement Application.ItemLoad:Comment capturer l'événement OutlookContact.Write?

private void ThisAddIn_Startup(object sender, System.EventArgs e) 
{ 
    this.Application.ItemLoad += new Microsoft.Office.Interop.Outlook.ApplicationEvents_11_ItemLoadEventHandler(Application_ItemLoad); 
} 

qui vérifierait si l'article est en cours ContactItem. S'il s'agit d'un ContactItem, il vérifiera si la propriété ContactItem.User4 contient la valeur xxx. Si ContactItem.User4 contient une valeur xxx, il accrochez une autre méthode avec l'événement ContactItem.Write:

void Application_ItemLoad(object Item) 
     { 
      if (Item is Outlook.ContactItem) 
      { 
       Outlook.ContactItem contact = (Outlook.ContactItem)Item; 
       System.Windows.Forms.MessageBox.Show("A new contact is loaded into memory"); 

       try 
       { 
        string user4 = contact.User4; 
        bool isSynchronized = user4 != null && user4.Contains("xxx"); 

        if (isSynchronized) 
        { 
         contact.Write += propertyChangeHandler; 
        } 
       } 
       catch (Exception e) 
       { 
        System.Windows.Forms.MessageBox.Show("An error occurred: "+e); 
       } 
      } 
     } 

Maintenant, le problème est, chaque fois que je tente d'accéder à la propriété ContactItem.User4, je reçois une exception:

System.Runtime.InteropServices.COMException: Les propriétés de l'élément et les méthodes ne peuvent pas être utilisées dans cette procédure événementielle.

Que dois-je faire pour ne pas avoir l'erreur ci-dessus?

Merci d'avoir lu ma longue question et j'attends vos suggestions avec impatience.

Répondre

1

Vous devez utiliser un événement différent. Selon this post - le contenu de l'élément ne sont pas encore chargés en mémoire. Vous devriez regarder l'événement Application.InspectorsNewInspector.

+0

Merci pour la réponse. Le problème dans l'exécution des étapes de Application_ItemLoad avec l'événement NewInspector est que propertyChangeHandler est accroché plusieurs fois avec l'événement ContactItem.Write. Pouvons-nous nous assurer qu'il n'est accroché qu'une seule fois? – craftsman

+0

Vous devez déconnecter le gestionnaire après la fermeture de l'inspecteur. Utilisez l'inspecteur ((Outlook.InspectorEvents_10_Event)) .Close + = new Outlook.InspectorEvents_10_CloseEventHandler (Inpsector_Close); ' – SliverNinja

+0

Et où dois-je mettre ce code? Si je l'insère dans le gestionnaire d'événements NewInspector, CloseEventHandler sera à nouveau attaché plusieurs fois avec un inspecteur. De plus, la méthode de rappel Inspector_Close n'a aucun paramètre. Même si je connecte cette méthode avec un événement Close, comment vais-je obtenir une référence à l'inspecteur ou à l'élément en cours de l'événement Write dont j'ai besoin pour déconnecter un gestionnaire? – craftsman