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();
}
}
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. –
a ajouté une solution alternative en utilisant ActiveExplorer.Selection. – manji
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? –