C # Заполнение дерева с PDF-файлов - PullRequest
0 голосов
/ 02 марта 2012

В моем приложении 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 Ответ

1 голос
/ 02 марта 2012

Видя из вашего обновления вот пример того, как я бы это сделал.Это не делает точно так же, как ваш код.Я поместил файловые узлы в качестве подузлов в каталог, потому что я чувствую, что это более интуитивно понятно, но изменить его обратно на то, что у вас, не должно быть сложно, если вы ищете именно такую ​​функциональность

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, поэтому я изменил это, чтобы просто использовать пути / строки.Я также предпочитаю, чтобы вспомогательные функции, такие как эта, не имели побочных эффектов, поэтому я возвращаю коллекцию узлов, а не присоединяю их к узлу, переданному в вашей версии (вы можете вызвать node.Nodes.AddRange, передавая результат, который является причинойпочему метод возвращает массив, а не IEnumerable)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...