C#用pdf文件填充树视图
本文关键字:视图 填充 文件 pdf | 更新日期: 2023-09-27 18:26:39
在我的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());
}
}
从您的更新中可以看到,这里有一个我将如何做到这一点的例子。它的作用与您的代码不完全相同。我把文件节点作为子节点放在目录中,因为我觉得这更直观,但如果这是你正在寻找的功能,那么把它改回你所拥有的应该不会很困难
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的原因)