2009-07-30 81 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對象模型來檢測當前選擇的內容,其含義是必須是當前的放置源。