0

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

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

问题是公用文件夹与子文件夹严重嵌套。遍历所有这些以尝试创建 TreeView 对象会引发 Exchange 错误(我遇到了“打开”项目的 RPC 限制)。

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

我想到的一种解决方案是在用户每次展开相应根文件夹的树时动态添加一个代表子文件夹的 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 回答