2009-07-30 7 views
4

Je développe une application qui doit effectuer un traitement sur les contacts Outlook de l'utilisateur. J'accède actuellement à la liste des contacts Outlook en itérant sur le résultat de MAPIFolder.Items.Restrict(somefilter), qui peut être trouvé dans Microsoft.Office.Interop.Outlook.Réception (glissé et) des contacts Outlook supprimés dans C#?

Dans mon application, mon utilisateur doit choisir plusieurs contacts pour appliquer une certaine opération. Je voudrais ajouter une fonctionnalité qui permettra à l'utilisateur de faire glisser un contact à partir d'Outlook et le déposer sur un certain ListBox dans l'interface utilisateur (je travaille dans WPF mais c'est probablement un problème plus générique).

Je suis très nouveau pour C# et WPF - comment puis-je:

  1. Recevez un article déposé sur une ListBox
  2. Vérifiez qu'il est un ContactItem (ou quelque chose qui enveloppe ContactItem)
  3. définissaient les tombé article à un ContactItem pour que je puisse le traiter

Merci

Répondre

6

J'ai essayé ceci avec un TextBox (pas de différence avec un ListBox en pratique).

Résumé:

Recherche dans tous les contacts de perspectives pour celui REÇU traînés sous forme de texte. La recherche ici est basée sur le nom complet de la personne.

condition (s):

Lorsque vous faites glisser un contact, il doit montrer l'FullName lorsqu'elle est sélectionnée dans les perspectives. Le seul hic est quand deux personnes ont les mêmes noms complets !! Si c'est le cas, vous pouvez essayer de trouver un identifiant unique pour une personne en combinant les propriétés ContactItem et en les recherchant dans le texte déplacé.

private void textBox1_DragDrop(object sender, DragEventArgs e) 
{ 
    if (e.Data.GetData("Text") != null) 
    {     
     ApplicationClass app; 
     MAPIFolder mapif; 
     string contactStr; 

     contactStr = e.Data.GetData("Text").ToString(); 

     app = new ApplicationClass();     

     mapif = app.GetNamespace("MAPI").GetDefaultFolder(OlDefaultFolders.olFolderContacts);     

     foreach (ContactItem tci in mapif.Items) 
     { 
      if (contactStr.Contains(tci.FullName)) 
      { 
       draggedContact = tci; //draggedContact is a global variable for example or a property... 
       break; 
      }      
     } 

     mapif = null; 

     app.Quit; 
     app = null; 
     GC.Collect(); 
    } 
} 

Bien sûr, ce code doit être optimisé, c'est seulement pour expliquer la méthode utilisée.

Vous pouvez essayer d'utiliser la propriété Explorer.Selection combinée avec GetData ("Texte") [pour vous assurer qu'elle provient d'Outlook, ou vous pouvez utiliser GetData ("Descripteur d'objet") dans l'événement DragOver, décoder le flux mémoire, recherche de "outlook", si non trouvé annuler l'opération glisser] Et pourquoi ne pas faire glisser plusieurs contacts!

private void textBox1_DragDrop(object sender, DragEventArgs e) 
{ 
    if (e.Data.GetData("Text") != null) 
    { 
     ApplicationClass app; 
     Explorer exp; 
     List<ContactItem> draggedContacts;     
     string contactStr; 

     contactStr = e.Data.GetData("Text").ToString(); 

     draggedContacts = new List<ContactItem>(); 

     app = new ApplicationClass(); 
     exp = app.ActiveExplorer(); 
     if (exp.CurrentFolder.DefaultItemType == OlItemType.olContactItem) 
     { 
      if (exp.Selection != null) 
      { 
       foreach (ContactItem ci in exp.Selection) 
       { 
        if (contactStr.Contains(ci.FullName)) 
        { 
         draggedContacts.Add(ci); 
        } 
       } 
      } 
     } 

     app = null; 
     GC.Collect(); 
    } 
} 
+0

Solution intéressante, merci. Plusieurs commentaires: 1) les machines supposées exécuter mon logiciel ont plus de 2000 contacts, ce qui signifie probablement que chaque événement de dépôt prendra plusieurs secondes; 2) il est problématique d'isoler un champ unique. FullName n'est pas nécessairement unique comme vous l'avez mentionné, auquel cas des replis seront nécessaires (par exemple, que se passe-t-il si les deux contacts ayant le même nom n'ont pas d'e-mails définis? Etc). Cela ressemble donc à une régression sur tous les champs (chaîne if-else) pour essayer de trouver le "tie-braker". Merci encore. –

+0

a ajouté une solution alternative en utilisant ActiveExplorer.Selection. – manji

+1

En ce qui concerne la sélection, je voudrais poser la même question que j'ai posée à Damien: que se passe-t-il si plusieurs fenêtres liées à Outlook sont ouvertes? Par exemple. le dossier des contacts principaux est ouvert et un écran d'e-mail supplémentaire. Si j'ai un contact sélectionné dans l'écran des contacts principaux, mais que je fais glisser un contact de l'écran de courrier électronique (par exemple de la clause "De") - qui sera reçu comme sélectionné par mon logiciel? –

0

Qu'est-ce que vous pourriez probablement faire i s Acceptez l'événement glisser-déposer dans votre application .wpf, puis récupérez les éléments sélectionnés dans Outlook et insérez-les dans votre application.

Mise à jour

Ajoutez les références d'Outlook PIA app pour vous. Ensuite, vous pouvez parcourir la collection currentSelection pour voir ce que l'utilisateur a fait glisser sur.

+1

Je ne comprends pas cette solution. Dans l'événement drop, je reçois un DataObject. Qu'est-ce que cela signifie "élément (s) sélectionné (s) d'Outlook"? Il peut y avoir plusieurs fenêtres ouvertes avec plusieurs sélections, toutes peuvent être des contacts pertinents ... Non? –

+1

Lorsque j'ai essayé cela, je n'ai pas pu obtenir directement l'élément de DataObject. Donc, dans le cas, je voudrais regarder Outlook Explorer.Selection qui contient le (s) élément (s) sélectionné (s) dans la vue actuelle. J'obtiendrais alors l'information de propriété de chacun des articles – 76mel

+0

@ 76mel: pourriez-vous s'il vous plaît coller un exemple de code? –

1

Un contact Outlook, en cas de chute, prend en charge les formats suivants:

(0): "RenPrivateSourceFolder" 
(1): "RenPrivateMessages" 
(2): "FileGroupDescriptor" 
(3): "FileGroupDescriptorW" 
(4): "FileContents" 
(5): "Object Descriptor" 
(6): "System.String" 
(7): "UnicodeText" 
(8): "Text" 

Le plus intéressant à la recherche d'un sur cette liste (pour moi) est descripteur d'objet, qui me conduisit à quelqu'un avec un problème de sondage similaire:

http://bytes.com/topic/visual-basic-net/answers/527320-drag-drop-outlook-vb-net-richtextbox

où il ressemble dans ce cas, ils détectent que c'est une goutte d'Outlook, puis utilisez la Modèle d'objet Outlook pour détecter ce qui est actuellement sélectionné, avec l'implication que cela doit être la source de dépôt actuelle.

+1

@Damien: que se passe-t-il si plusieurs fenêtres liées à Outlook sont ouvertes? Par exemple. le dossier des contacts principaux est ouvert et un écran d'e-mail supplémentaire. Si j'ai un contact sélectionné dans l'écran des contacts principaux, mais que je fais glisser un contact de l'écran de courrier électronique (par exemple de la clause "De") - qui sera reçu comme sélectionné par mon logiciel? –

+0

Je ne prétendrai pas être un expert dans le domaine, et j'ai obtenu la liste ci-dessus simplement en mettant en place une application de formulaire Windows, permettant le glisser-déposer, et expérimenter avec ce que je recevais, et comment il pourrait être utilisé. Dans ce cas, je devrais vous suggérer de faire la même chose - expérimenter avec le code que vous pouvez trouver, ou le code que vous pouvez mettre ensemble. Déboguez l'événement drop, trouvez des objets intéressants dans la fenêtre locale. Ecrire un nouveau code qui obtient ces objets et voir où vous pouvez aller. –

Questions connexes