C#使用pdf文件填充树视图

时间:2012-03-02 12:51:17

标签: c# treeview

在我的Winforms应用程序中,我创建了一个树视图来显示某个项目的所有文件夹,这很有效,但我也希望能够看到存储在文件夹中的pdf文件。

这是我用来获取某个项目的文件夹结构的代码。

void PopulateTree()
    {
        //Getting the correct location for the project
            TreeNode rootnode = new TreeNode(@"Z:\Projecten\" + slctJaarBox.Text + "\\" + slctProjectBox.Text);
            treeView1.Nodes.Add(rootnode);
            FillChildNodes(rootnode);
            treeView1.Nodes[0].Expand();

    }


    void FillChildNodes(TreeNode node)
    {
        //Creates the nodes for the folder structure on root level
        try
        {
            FileInfo files = new FileInfo(node.FullPath);

            DirectoryInfo dirs = new DirectoryInfo(node.FullPath);
            foreach (DirectoryInfo dir in dirs.GetDirectories())
            {
                TreeNode newnode = new TreeNode(dir.Name);
                node.Nodes.Add(newnode);
                newnode.Nodes.Add("*");
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message.ToString());
        }
    }

    private void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e)
    {
        //Will only load and add a node subdirectorys if a node is expanded, 
        //this is for faster loading
        if (e.Node.Nodes[0].Text == "*")
        {
            e.Node.Nodes.Clear();
            FillChildNodes(e.Node);
        }
    }

让它工作,这可能不是最好的方法。

void FillChildNodes(TreeNode node)
    {
        try
        {

            DirectoryInfo dirs = new DirectoryInfo(node.FullPath);
            foreach (DirectoryInfo dir in dirs.GetDirectories())
            {
                TreeNode newnode = new TreeNode(dir.Name);
                node.Nodes.Add(newnode);
                newnode.Nodes.Add("*");

            }

            FileInfo[] arrFilesInFolder = null;
            FileInfo bestandInFolder = null;

            arrFilesInFolder = dirs.GetFiles("*.pdf");
            foreach (FileInfo fileInFolder_loopVariable in arrFilesInFolder)
            {
                bestandInFolder = fileInFolder_loopVariable;
                TreeNode newnode = new TreeNode(bestandInFolder.Name);
                node.Nodes.Add(newnode);
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message.ToString());
        }
    }

1 个答案:

答案 0 :(得分:1)

从您的更新中看到这是我将如何做的一个例子。它与您的代码完全不同。我把文件节点作为子节点放到了目录中,因为我觉得它更直观,但如果你正在寻找的功能那么将它改回你所拥有的应该不会很困难

public TreeNode[] CreateChildNodes(){
      return (from directory in Directory.GetDirectories(node.FullPath)
             let directoryName = Path.GetDirectoryName(directory)
             let pdfFiles = from file in Directory.GetFiles(directory,"*.pdf")
                            select new TreeNode(Path.GetFileName(file))
             select new TreeNode(directoryName,pdfFiles.ToArray()).ToArray();
}

有几点需要注意;由于您只使用文件和目录的名称,我认为在实例化DirectoryInfo或FileInfo对象时没有任何想法,因此我将其更改为仅使用路径/字符串。我也喜欢这样的辅助函数是sideeffect free,这就是为什么我返回一个节点集合而不是将它们附加到你的版本中传入的节点(你可以调用node.Nodes.AddRange传递结果,这就是原因)为什么该方法返回一个数组而不是IEnumerable)