我用 TextBox 试过这个(实际上与 ListBox 没有区别)。
概括 :
在所有 Outlook 联系人中搜索作为文本拖入的联系人。此处的搜索基于此人的全名。
条件):
拖动联系人时,在 Outlook 中选择时必须显示全名。唯一的问题是两个人的全名相同!如果是这种情况,您可以尝试通过组合 ContactItem 属性并在拖动的文本中搜索它们来找到一个人的唯一标识符。
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();
}
}
当然这段代码是组织优化的,它只是解释使用的方法。
您可以尝试将 Explorer.Selection 属性与 GetData("Text") 结合使用 [以确保它来自 Outlook,或者您可以在 DragOver 事件中使用 GetData("Object Descriptor"),解码内存流,搜索“outlook 》,如果没有找到取消拖动操作] 为什么不拖动多个联系人!
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();
}
}