2013-05-01 62 views
5

下面是我的代码如何在TreeView中显示目录?

DirectoryInfo directoryInfo = new DirectoryInfo(@"C:\Users\Shahul\Documents\Visual Studio 2010\Projects\TreeView\TreeView\bin\FileExplorer"); 

private void Form1_Load(object sender, EventArgs e) 
{ 
    if (Directory.Exists("FileExplorer")) 
    { 
     try 
     { 
      DirectoryInfo[] directories = directoryInfo.GetDirectories(); 

      foreach (FileInfo file in directoryInfo.GetFiles()) 
      { 
       if (file.Exists) 
       { 
        TreeNode nodes = treeView.Nodes[0].Nodes.Add(file.Name); 
       } 
      } 

      if (directories.Length > 0) 
      { 
       foreach (DirectoryInfo directory in directories) 
       { 
        TreeNode node = treeView.Nodes[0].Nodes.Add(directory.Name); 
        node.ImageIndex = node.SelectedImageIndex = 0; 
        foreach (FileInfo file in directory.GetFiles()) 
        { 
         if (file.Exists) 
         { 
          TreeNode nodes = treeView.Nodes[0].Nodes[node.Index].Nodes.Add(file.Name); 
         } 
        } 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
    } 
} 

当我跑我只是得到了一个空白树状形式?无法弄清楚什么是错误?

顺便说一句,这是我在Stack Overflow中的第一篇文章。

+0

我复制你的代码,它似乎是工作在我结束。 (除了因为访问权限而导致某些文件夹无法读取的警告)顺便说一句,尝试使这个函数成为一个递归的函数来添加节点和什么。可以让你更清楚地了解正在发生的事情以及你的错误可能在哪里。 此外,你正在设置一个变量节点,你什么都不做(TreeNode节点被赋值但未被使用)。 – 2013-05-01 08:57:56

+0

调试并确保树在函数返回之前确实包含元素。也许你正在将节点添加到错误的树中。也许这棵树在之后直接被清除。调试。 – SimpleVar 2013-05-01 09:01:17

回答

6

这应该解决您的问题,我想在WinForm的,但:

public Form1() 
    { 
     InitializeComponent(); 

     DirectoryInfo directoryInfo = new DirectoryInfo(@"C:\Users\hikuma\Documents\IR"); 
     if (directoryInfo.Exists) 
     { 
      treeView1.AfterSelect += treeView1_AfterSelect; 
      BuildTree(directoryInfo, treeView1.Nodes); 
     } 
    } 

    private void BuildTree(DirectoryInfo directoryInfo, TreeNodeCollection addInMe) 
    { 
     TreeNode curNode = addInMe.Add(directoryInfo.Name); 

     foreach (FileInfo file in directoryInfo.GetFiles()) 
     { 
      curNode.Nodes.Add(file.FullName, file.Name); 
     } 
     foreach (DirectoryInfo subdir in directoryInfo.GetDirectories()) 
     { 
      BuildTree(subdir, curNode.Nodes); 
     } 
    } 

    private void treeView1_AfterSelect(object sender, TreeViewEventArgs e) 
    { 
     if(e.Node.Name.EndsWith("txt")) 
     { 
      this.richTextBox1.Clear(); 
      StreamReader reader = new StreamReader(e.Node.Name); 
      this.richTextBox1.Text = reader.ReadToEnd(); 
      reader.Close(); 
     } 
    } 

它是如何可以打开丰富的文本框文件一个简单的例子,它可以改善很多:)。 你可能想标记为答案或投票,如果它帮助:)!

+0

非常感谢它解决了这个问题。另一个快速帮助如何显示内容到丰富的文本框,即让我说我的treeview文件夹结构下我有一些记事本文件,当我选择任何记事本或双击它应显示内容到richtext框... – 2013-05-01 09:24:28

+0

谢谢你你的帮助,我只是将你的代码粘贴在我编写的表单上,没有任何问题。但是,当我点击我的文本文件显示在我的树视图结构没有任何显示在richtextbox。我的文本文件中有一些内容 – 2013-05-01 10:25:05

+0

在表单上添加一个富文本框,它将在文本框中显示文件内容... – 2013-05-01 10:34:09

0

试试这个:(注意:请确保您的DirectoryInfo位置包含一些文件夹)

DirectoryInfo directoryInfo = new DirectoryInfo(@"C:\Users\Shahul\Documents\Visual Studio 2010\Projects\TreeView\TreeView\bin\FileExplorer"); 

private void Form1_Load(object sender, EventArgs e) 
{ 
    if (directoryInfo.Exists) 
    { 
     try 
     { 
      treeView.Nodes.Add(directoryInfo.Name); 
      DirectoryInfo[] directories = directoryInfo.GetDirectories(); 

      foreach (FileInfo file in directoryInfo.GetFiles()) 
      { 
       if (file.Exists) 
       { 
        TreeNode nodes = treeView.Nodes[0].Nodes.Add(file.Name); 
       } 
      } 


      if (directories.Length > 0) 
      { 
       foreach (DirectoryInfo directory in directories) 
       { 
        TreeNode node = treeView.Nodes[0].Nodes.Add(directory.Name); 
        node.ImageIndex = node.SelectedImageIndex = 0; 
        foreach (FileInfo file in directory.GetFiles()) 
        { 
         if (file.Exists) 
         { 
          TreeNode nodes = treeView.Nodes[0].Nodes[node.Index].Nodes.Add(file.Name); 
         } 
        } 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
    } 
} 
+0

我只是试过你的代码,我仍然有同样的问题.. – 2013-05-01 09:15:32

0

DirectoryInfo.Exists( “FileExplorer”)将检查“C:\用户\ Shahul \文档\ Visual Studio 2010的\当您在调试模式下运行时,“Projects \ TreeView \ TreeView \ bin \ debug \ FileExplorer”,而不是“C:\ Users \ Shahul \ Documents \ Visual Studio 2010 \ Projects \ TreeView \ TreeView \ bin \ FileExplorer”。

0

尝试以下操作:

private void Form1_Load(object sender, EventArgs e) 
    { 
     if (directoryInfo.Exists) 
     { 
      try 
      { 
       treeView.Nodes.Add(LoadDirectory(directoryInfo));      
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 
     } 
    } 

    private TreeNode LoadDirectory(DirectoryInfo di) 
    { 
     if (!di.Exists) 
      return null; 

     TreeNode output = new TreeNode(di.Name, 0, 0); 

     foreach (var subDir in di.GetDirectories()) 
     { 
      try 
      { 
       output.Nodes.Add(LoadDirectory(subDir)); 
      } 
      catch (IOException ex) 
      { 
       //handle error 
      } 
      catch { } 
     } 

     foreach (var file in di.GetFiles()) 
     { 
      if (file.Exists) 
      { 
       output.Nodes.Add(file.Name); 
      } 
     } 

     return output; 
    } 
} 

这是更好地打出解析成一个递归方法的目录,这样就可以一路走下来的树。

这将阻止用户界面,直到它完全加载 - 但固定,超出这个答案的范围...

:)

+0

谢谢你的帮助:-)我知道它是固定的 – 2013-05-01 09:53:26

+0

没有probs!将来,请确保您告诉我们您是否使用winforms/WPF,因为它们处理事情的方式不同。 – Chemass 2013-05-01 10:37:32

+0

好的,确定...... – 2013-05-01 10:43:30