如何生成重嵌套Outlook文件夹的TreeView?

时间:2012-09-05 16:26:50

标签: treeview outlook

我正在开发一个独立的Outlook应用程序。用户需要从olPublicFoldersAllPublicFolder派生的列表中选择Outlook文件夹。所选文件夹可以位于公用文件夹的根目录下,也可以位于另一个文件夹的子文件夹中。

以前我使用的是NameSpace对象的.PickFolder方法。这样可行,但我宁愿创建自己的选择器对话框,该对话框已集成到我自己的应用程序中。

问题是公用文件夹与子文件夹严重嵌套。在尝试创建TreeView对象时迭代所有这些是抛出一个Exchange错误(我打击了“打开”项的RPC限制)。

所以我的问题是,生成TreeView of Outlook文件夹和任何子文件夹(也可能包含子文件夹等)的最佳方法是什么?我认为Folders对象的GetTable方法可以实现这一点,但它似乎仅限于Items而不是文件夹。

我想到的一个解决方案是每次用户展开相应根文件夹的树时动态添加一个表示子文件夹的TreeViewItem。但我对如何实现这一点感到有些失望。

1 个答案:

答案 0 :(得分: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);
            }
        }
    }
}