2009-07-30 51 views
4

我正在开发一个应用程序,需要在用户的Outlook联系人上执行一些处理。我正在通过迭代MAPIFolder.Items.Restrict(somefilter)的结果来访问Outlook联系人列表,该结果可在Microsoft.Office.Interop.Outlook中找到。在C#中接收(拖放)Outlook联系人?

在我的应用程序中,我的用户需要选择多个联系人来应用某个操作。我想添加一个功能,将允许用户从Outlook中拖动联系人并将其放在UI中的某个ListBox(我在WPF中工作,但这可能是更通用的问题)。

我很新的C#和WPF - 我怎么能:

  1. 接收一个列表框掉落的物品
  2. 确认这是一个ContactItem(或东西,包装ContactItem)
  3. 铸下降的项目到ContactItem这样我就可以处理它

感谢

回答

6

我试着用一个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(); 
    } 
} 
0

你也许可以做我什么s接受.wpf应用程序中的拖放事件,然后从Outlook中获取所选项目并将它们拖到您的应用程序中。

更新

观PIA引用添加到您的应用程序。

Microsoft.Office.Interop.Outlook.Application app = new Microsoft.Office.Interop.Outlook.Application(); 
Microsoft.Office.Interop.Outlook.Explorer activeExplorer = app.ActiveExplorer(); 
Microsoft.Office.Interop.Outlook.Selection currentSelection = activeExplorer.Selection; 

然后,您可以遍历currentSelection集合来查看用户拖动的内容。

+1

我不明白这个解决方案。在drop事件中,我收到一个DataObject。这是什么意思“从Outlook中选择项目”?可能有多个打开的窗口有多个选择,都可能是相关的联系人...不是? – 2009-07-31 16:29:33

+1

当我尝试这个时,我无法直接从DataObject获取项目。所以在这个事件中,我会查看包含当前视图中所选项目的outlook Explorer.Selection。然后,我会从每个项目 – 76mel 2009-07-31 17:17:57

+0

@ 76mel获取属性信息:请问您可以粘贴一些示例代码吗? – 2009-08-01 06:24:31

1

Outlook联系人,跌落时,支持以下格式:

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

最有趣的是,名单上寻找一个(对我来说)是对象描述符,然后带我到有人用发音相似的问题:

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

如果它看起来像在这种情况下,他们发现,这是一个Outlook下降,然后用Outlook对象模型来检测当前选择的内容,其含义是必须是当前的放置源。