2009-11-16 5 views
1

J'écris un complément pour Outlook pour analyser tous les mails dans un dossier en cliquant sur un bouton de menu contextuel personnalisé. J'ai le bouton connecté, mais lorsque vous essayez d'utiliser la boucle foreach dans le dossier pour vérifier les éléments de courrier, il semble seulement vérifier le premier.C# Outlook 2007 add-in: analyse récursive des articles de courrier

Je prends les détails du dossier ici:

void Application_FolderContextMenuDisplay(Office.CommandBar CommandBar, ***MAPIFolder Folder***) 

Je passe ensuite à un analyseur:

public void checkFolder(MAPIFolder folder) 
    { 
     MailParser parser = new MailParser(); 
     foreach (MailItem item in folder.Items) 
     { 
      parser.parseMail(item); 
     } 
    } 

Il est le foreach ici qui semble à l'échec.

Des idées? Ça me rend dingue.

+0

Une erreur plus descriptive que "ça échoue" nous aiderait considérablement: D – JustLoren

+0

Il était explicite - il itère seulement le premier élément. –

Répondre

1

Je ne suis pas très familier avec le modèle objet de perspectives, mais un coup d'oeil, je dirais que le problème est que vous supposez à tort que tous les éléments d'un dossier sont MailItem instances. Ils pourraient également être des objets comme ContactItem. Vous devez vérifier explicitement pour voir si la valeur est un MailItem comme si

foreach (object current in folder.Items) { 
    MailItem mi = current as MailItem; 
    if (mi != null) { 
    parser.parseMail(mi); 
    } 
} 
0

Je suppose que MAPIFolder.Items n'est pas fortement typé, mais vous l'itérez comme si c'était le cas. Je vous suggère d'aller avec:

foreach(object item in folder.Items) 
{ 
    if (item is MailItem) 
    parser.parseMail((MailItem)item); 
} 
0

foreach est utile pour une collection qui implémente l'interface IEnumerable. Selon MSDN, il semblerait que la collection particulière Items n'implémente pas IEnumerable. Essayez d'utiliser une place boucle for:

int c = folder.Items.Count 
for (i=0;i<=c;i++) 
{ 
    //Do your thing 
} 
1

Vous devez utiliser l'API Microsoft.Office.Interop.Outlook.Extensions.Linq, ce qui permet le type de récupération sécuritaire des articles :

public void checkFolder(MAPIFolder folder) 
{ 
    MailParser parser = new MailParser(); 
    IQueryable<Mail> query = folder.Items.AsQueryable<Mail>(); 
    foreach (MailItem wrappedItem in query) 
    { 
     parser.parseMail(wrappedItem.Item); 
    } 
} 

ici, le type Mail est une sous-classe de OutlookItemBase<TaskItem>. Il a une propriété Item qui renvoie l'objet COM MailItem. Il va également filtrer en toute sécurité les types non compatibles sans lancer d'exception, donc vous n'avez pas besoin d'ajouter null contrôles.

Les extensions API résoudre également le problème de la classe de base manquant pour les éléments, afin que vous puissiez enfin accéder à UserProperties et comme par la classe de base OutlookItem non générique. De plus, l'API prend en charge certains attributs, ce qui peut améliorer les performances des requêtes Linq, en les exécutant du côté Outlook au lieu de COM. Malheureusement, ils ne sont pas bien documentés.

Questions connexes