4

ユーザーのOutlook連絡先に対して何らかの処理を実行する必要があるアプリケーションを開発しています。現在、の結果を繰り返し処理してOutlookの連絡先のリストにアクセスしています。MAPIFolder.Items.Restrict(somefilter)これはにありますMicrosoft.Office.Interop.Outlook

私のアプリケーションでは、ユーザーは特定の操作を適用するためにいくつかの連絡先を選択する必要があります。ユーザーがOutlookから連絡先をドラッグしてUIの特定のリストボックスにドロップできるようにする機能を追加したいと思います(私はWPFで作業していますが、これはおそらくより一般的な問題です)。

私はC#とWPFに非常に慣れていません-どうすればよいですか?

  1. リストボックスにドロップされたアイテムを受け取る
  2. ContactItem(またはContactItemをラップするもの)であることを確認します
  3. ドロップしたアイテムをContactItemにキャストして、処理できるようにします

ありがとう

4

3 に答える 3

6

これをTextBoxで試しました(実際にはListBoxと違いはありません)。

概要 :

テキストとしてドラッグされたものをすべての Outlook 連絡先で検索します。ここでの検索は、個人の FullName に基づいています。

条件):

連絡先をドラッグすると、Outlook で選択したときに FullName が表示される必要があります。唯一の問題は、2 人が同じフルネームを持っている場合です。その場合は、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();
    }
}
于 2009-09-03T11:40:16.313 に答える
1

ドロップされた 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 オブジェクト モデルを使用して現在選択されているものを検出し、それが現在のドロップ ソースである必要があることを示唆します。

于 2009-09-03T12:05:02.120 に答える
0

おそらくできることは、.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 コレクションを反復処理して、ユーザーが何をドラッグしたかを確認できます。

于 2009-07-31T13:42:56.907 に答える