2012-06-07 4 views
2

J'essaye d'écrire un addin qui remarque quand un rendez-vous est enregistré et fait quelques données. Pour cela, je dois vérifier si, lorsque l'inspecteur actif est fermé, l'élément est sauvegardé ou non.Outlook Addin Item Enregistrer

Mon problème est le suivant: en essayant de lier un WriteEvent -listener à l'élément courant dans le FormRegionShowing -method, j'ai besoin ActiveInspector à l'événement obtenir l'élément en cours. Cependant, lors de l'obtention du ActiveInspector, il s'agit probablement de null, car cette méthode est appelée avant que l'inspecteur actif ne soit réellement actif.

Lors de la tentative de liaison dans la méthode FormRegionClosed, cependant, l'événement d'écriture ne se déclenche jamais. Alors, comment puis-je savoir quand un AppointmentItem est effectivement enregistré par l'utilisateur?

EDIT: Je réussi à lier l'événement d'écriture dans le FormRegionShowing -method, mais il ne parvient toujours pas le feu:

private void ADDIN_NAME_FormRegionShowing(object sender, System.EventArgs e){ 

    Outlook.AppointmentItem currentItem = (Outlook.AppointmentItem)this.OutlookItem; 

    currentItem.Write += new Outlook.ItemEvents_10_WriteEventHandler(currentItem_Write); 

    currentItem.AfterWrite += new Outlook.ItemEvents_10_AfterWriteEventHandler(currentItem_AfterWrite); 

    MessageBox.Show("added handlers"); 

} 

void currentItem_AfterWrite(){ 
    MessageBox.Show("item has been saved"); 
} 

void currentItem_Write(ref bool Cancel){ 
    MessageBox.Show("item being saved"); 
} 

Répondre

2

Vous devez déplacer Outlook.AppointmentItem à une variable de niveau de classe. Dans COM, le RCW sera collecté lorsque la fonction est hors de portée. Si vous souhaitez utiliser des événements avec Office, vous devez vous assurer de review the eventing model. Voir aussi related SO post.

private Outlook.AppointmentItem currentItem; // keep events from getting GC'd 

private void ADDIN_NAME_FormRegionShowing(object sender, System.EventArgs e){ 
    currentItem = (Outlook.AppointmentItem)this.OutlookItem; 
    currentItem.Write += new Outlook.ItemEvents_10_WriteEventHandler(currentItem_Write); 
    currentItem.AfterWrite += new Outlook.ItemEvents_10_AfterWriteEventHandler(currentItem_AfterWrite); 
} 
+0

Génial, merci beaucoup! – arik

+0

Mais en utilisant ce code, l'effet est que chaque fois que j'ouvre et édite l'événement, le nombre d'événements Write et AfterWrite est incrémenté de un. Le MessageBox dans le test est montré N fois, étant N, la quantité de fois l'élément a été ouvert et édité! :( –

+0

@CesarVega - On dirait que 'currentItem' est persisté entre les vues d'événements.Vous devez déconnecter les événements après la fermeture de la région de formulaire.Voyez [' FormRegionClosed'] (http://msdn.microsoft.com/ en-us/library/microsoft.office.tools.outlook.formregioncontrol.formregionclosed.aspx) et déconnectez les événements 'Write' /' AfterWrite' (* via l'opérateur overloading - = *) – SliverNinja

Questions connexes