当前位置: 首页 > 知识库问答 >
问题:

如何生成大量嵌套的Outlook文件夹的树视图?

长孙承嗣
2023-03-14

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

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

我想到的一个解决方案是动态添加一个TreeViewItem,它在用户每次展开相应根文件夹的树时表示一个子文件夹。但我对如何做到这一点有些迷茫。

共有1个答案

姜钧
2023-03-14

这就是我想出来的。可能有一个更好的方法来处理这个...但本质上我构建了一个表示每个文件夹的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);
            }
        }
    }
}
 类似资料:
  • 问题内容: 尝试删除以下 用户 创建的 node_modules 目录时: 源文件名大于文件系统支持的文件名。尝试移动到路径名较短的位置,或尝试重命名为较短的名称,然后再尝试执行此操作 我也尝试过+ ,但仍然遇到相同的问题。 问题答案: 由于这是Google的最佳搜索结果,因此这对我有用: 安装RimRaf: 在项目文件夹中,使用以下命令删除node_modules文件夹: 如果要递归删除: [

  • 我有一个spring boot应用程序,我想在其中外部化消息。我将这些消息分为错误、信息和成功。因此,我创建了如下所示的嵌套文件夹结构: 并且,我正试图通过以下方式从服务中访问它: 这给了我以下例外情况: missingResourceException:找不到bundle的基本名称错误,区域设置为 但是,如果我将属性文件保存在下面的文件夹之外,它可以正常工作: null

  • 如果我们有一个文件夹,其中包含所有内容。txt文件,我们可以使用sc.textFile(“folder/*.txt”)读取所有这些文件。但是,如果我有一个文件夹,其中包含更多名为datewise的文件夹,例如,,。。。,其中还包含一些<代码>。记录文件。如何在Spark中阅读这些内容? 在我的例子中,结构更加嵌套

  • 问题内容: 我有一个名为“数据”的文件夹。此文件夹有一个名为“收件箱”的子文件夹,其中有多个“ .txt”文件。可以修改“数据”文件夹,最后会有多个带有“收件箱”子文件夹和“ .txt”文件的子文件夹。我需要监视“收件箱”文件夹中的“数据”文件夹和“ .txt”文件。我怎样才能做到这一点? INotify只是监视文件夹,并在创建子文件夹时弹出事件。创建“ .txt”文件(在哪个文件夹中)时,如何弹

  • 我正在做一个粒子在晶格中运动的随机行走模拟。因此,我必须创建大量的随机数,大约10^12及以上。目前,我正在使用C 11提供的可能性 问题是:我能做些什么来减少生成这些数字所需的CPU时间,以及对它们的质量有什么影响? 如您所见,我尝试了不同的引擎,但这对CPU时间没有太大影响。此外,我的uniform01(gen)和generate\u canonical之间有什么区别 编辑:通过阅读答案,我得

  • 我有以下结构: 我正在寻找一种算法,如何从创建一个类似父子嵌套的结构。 逻辑是这样的: 假设:列表中的第一项总是以深度=0开头 如果深度大于最后一个,它必须是最后一个的孩子 我没法让它工作。它应该是递归的,具有无限嵌套/深度级别。 谢谢你们的帮助!