0

スタンドアロンの Outlook アプリケーションを開発しています。ユーザーは、olPublicFoldersAllPublicFolder から派生したリストから Outlook フォルダーを選択する必要があります。選択したフォルダーは、パブリック フォルダーのルート内にあるか、別のフォルダーのサブフォルダー内にある可能性があります。

以前は NameSpace オブジェクトの .PickFolder メソッドを使用していました。これは機能しますが、自分のアプリケーションに統合される独自のピッカー ダイアログを作成したいと思います。

問題は、パブリック フォルダーがサブフォルダーで大きくネストされていることです。TreeView オブジェクトを作成しようとしてこれらすべてを反復すると、Exchange エラーがスローされます (「開いている」アイテムの RPC 制限に達しています)。

私の質問は、Outlook フォルダーとサブフォルダー (サブフォルダーなども含まれる場合があります) の TreeView を生成する最良の方法は何ですか? Folders オブジェクトの GetTable メソッドでこれを実現できると思っていましたが、これはフォルダーではなくアイテムに限定されているようです。

私が考えた 1 つの解決策は、ユーザーが対応するルート フォルダーのツリーを展開するたびに、サブフォルダーを表す TreeViewItem を動的に追加することでした。しかし、私はこれを達成する方法についてやや迷っています。

4

1 に答える 1

0

さて、これは私が思いついたものです。おそらくこれを処理するより良い方法があります...しかし、基本的には、各フォルダーを表す TreeViewItem を構築します。サブフォルダーが存在する場合はエキスパンダー グラフィックを表示したいのですが、明らかに、サブフォルダー オブジェクトを追加することはできません。これは、サブフォルダーを反復処理するときに最終的に RPC 制限エラーが発生するためです。

public partial class MainWindow : Window
{
    Microsoft.Office.Interop.Outlook.Application olApp = Marshal.GetActiveObject("Outlook.Application") as Microsoft.Office.Interop.Outlook.Application;
    Microsoft.Office.Interop.Outlook.NameSpace olNs;

    public MainWindow()
    {
        InitializeComponent();
        BuildTree();
    }

    public void BuildTree()
    {
        olNs = olApp.GetNamespace("MAPI");
        Folder rootFolder = olNs.GetDefaultFolder(OlDefaultFolders.olFolderInbox) as Folder;

        TreeViewItem tvi = new TreeViewItem();
        tvi.Header = rootFolder.Name;
        tvi.Tag = rootFolder;   //store Folder object in TreeViewItem tag
        tvi.Expanded += new RoutedEventHandler(tvi_Expanded);   //Add expander event

        //Check for subfolders within this folder
        if (rootFolder.Folders.Count > 0)
        {
            //Add placeholder item to add expander graphic
            tvi.Items.Add("");
        }
        tv_MyTree.Items.Add(tvi); //main TreeView object
    }

    private void tvi_Expanded(object sender, RoutedEventArgs e)
    {
        TreeViewItem svi = sender as TreeViewItem;  //source/sender TreeViewItem
        svi.Expanded -= (tvi_Expanded); //Remove expander event, otherwise any expanders that are clicked later will trigger this method

        Folder f = svi.Tag as Folder;

        if (f.Folders.Count > 0)
        {
            svi.Items.Clear();  //clear list - effectively removes placeholder, rebuilds tree
            foreach (Folder sub in f.Folders)
            {
                TreeViewItem tvi = new TreeViewItem();
                tvi.Header = sub.Name;
                tvi.Tag = sub;
                tvi.Expanded += new RoutedEventHandler(tvi_Expanded);
                if (sub.Folders.Count > 0)
                {
                    tvi.Items.Add("");
                }
                svi.Items.Add(tvi);
            }
        }
    }
}
于 2012-09-06T02:04:39.230 に答える