我试着用一个TextBox(在实践中与ListBox没有什么区别)。
摘要:
在一个所有Outlook联系人搜索收到拖累文本。 这里的搜索是根据这个人的全名。
条件(S):
当拖动联系人,则必须在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”),解码内存流,搜索“展望”,如果没有找到取消拖动操作]为什么不拖动多个联系人!
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();
}
}
我不明白这个解决方案。在drop事件中,我收到一个DataObject。这是什么意思“从Outlook中选择项目”?可能有多个打开的窗口有多个选择,都可能是相关的联系人...不是? – 2009-07-31 16:29:33
当我尝试这个时,我无法直接从DataObject获取项目。所以在这个事件中,我会查看包含当前视图中所选项目的outlook Explorer.Selection。然后,我会从每个项目 – 76mel 2009-07-31 17:17:57
@ 76mel获取属性信息:请问您可以粘贴一些示例代码吗? – 2009-08-01 06:24:31