Получать (перетаскивать и) отбрасывать контакты Outlook в C #? - PullRequest
4 голосов
/ 30 июля 2009

Я разрабатываю приложение, которое должно выполнить некоторую обработку контактов пользователя в Outlook. В настоящее время я обращаюсь к списку контактов Outlook, перебирая результат MAPIFolder.Items.Restrict(somefilter), который можно найти в Microsoft.Office.Interop.Outlook.

В моем приложении моему пользователю нужно выбрать несколько контактов, чтобы применить к ним определенную операцию. Я хотел бы добавить функцию, которая позволит пользователю перетаскивать контакт из Outlook и помещать его в определенный ListBox в пользовательском интерфейсе (я работаю в WPF, но, возможно, это более общая проблема)

Я очень новичок в C # и WPF - как я могу:

  1. Получить упавший предмет в ListBox
  2. Убедитесь, что это ContactItem (или что-то, что оборачивает ContactItem)
  3. Приведите брошенный элемент к ContactItem, чтобы я мог обработать его

Спасибо

Ответы [ 3 ]

6 голосов
/ 03 сентября 2009

Я пробовал это с TextBox (нет разницы с ListBox на практике).

Резюме:

Поиск во всех внешних контактах того, кто был получен в виде текста. Поиск здесь основан на ФИО человека.

условие (ы):

Когда вы перетаскиваете контакт, он должен отображать полное имя, если оно выбрано в 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, или вы можете использовать GetData ("Object Descriptor") в событии DragOver, декодировать поток памяти, выполнить поиск для "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();
    }
}
1 голос
/ 03 сентября 2009

При удалении контакт Outlook поддерживает следующие форматы:

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

Самым интересным в этом списке (для меня) является Object Descriptor, который затем привел меня к кому-то с похожей проблемой звучания:

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

Где это выглядит в этом случае, они обнаруживают, что это отбрасывание Outlook, а затем используют объектную модель Outlook для определения того, что в данный момент выбрано, с тем значением, которое должно быть текущим источником отбрасывания.

0 голосов
/ 31 июля 2009

Что вы, вероятно, могли бы сделать, это принять событие перетаскивания в вашем приложении .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, чтобы посмотреть, что перетащил пользователь.

...