簡體   English   中英

在C#中接收(拖動並)刪除Outlook聯系人?

[英]Receiving (dragged and) dropped Outlook contacts in C#?

我正在開發一個需要對用戶的Outlook聯系人執行某些處理的應用程序。 我目前通過迭代MAPIFolder.Items.Restrict(somefilter)的結果來訪問Outlook聯系人列表,該結果可以在Microsoft.Office.Interop.Outlook找到。

在我的應用程序中,我的用戶需要選擇幾個聯系人來應用某個操作。 我想添加一個功能,允許用戶從Outlook拖動聯系人並將其放在UI中的某個ListBox上(我在WPF中工作,但這可能是更通用的問題)。

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

  1. 在ListBox上接收已刪除的項目
  2. 驗證它是一個ContactItem(或包裝ContactItem的東西)
  3. 將刪除的項目轉換為ContactItem,以便我可以處理它

謝謝

我嘗試使用TextBox(在實踐中與ListBox沒有區別)。

摘要:

在所有Outlook聯系人中搜索被收錄的文本。 此處的搜索基於此人的FullName。

條件):

拖動聯系人時,它必須在Outlook中選中時顯示FullName。 唯一的問題是當兩個人擁有相同的全名!! 如果是這種情況,您可以嘗試通過組合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();
    }
}

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對象模型來檢測當前選擇的內容,暗示必須是當前的放置源。

您可能做的是接受.wpf應用程序中的拖放事件,然后從outlook中獲取所選項目並將其拉入您的應用程序。

更新

將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集合以查看用戶拖動的內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM