2013-05-01 21 views
5

Poniżej jest mój kodJak wyświetlić katalogi w 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); 
     } 
    } 
} 

Kiedy biegnę, pojawia się pusty formularz TreeView? Nie można określić, jaki jest błąd?

Przy okazji to mój pierwszy wpis w Stack Overflow.

+0

skopiowane kod i wydaje się działać na moim końcu. (Poza tym, że ostrzeżenia o niektórych folderach są nieczytelne z powodu praw dostępu) Przy okazji, spróbuj uczynić tę funkcję rekursywną dla dodawania węzłów i cokolwiek innego. Może dać ci lepszą jasność tego, co się dzieje i gdzie może być twój błąd. Ponadto ustawiasz zmienne węzły, z którymi nic nie robisz (węzły TreeNode zostaną przypisane, ale nie są używane). –

+0

Wykonaj debugowanie i upewnij się, że drzewo zawiera elementy przed powrotem funkcji. Może dodajesz węzły do ​​niewłaściwego drzewa. Może drzewo zostanie gdzieś bezpośrednio oczyszczone. Odpluskwić. – SimpleVar

Odpowiedz

6

To powinno rozwiązać problem, próbowałem na WinForm choć:

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(); 
     } 
    } 

Jest to prosty przykład, jak można otworzyć plik w bogatym polu tekstowym, może być o wiele lepsze :). Możesz chcieć oznaczyć jako odpowiedź lub zagłosować, jeśli pomogło :) !!

+0

dziękuję bardzo rozwiązało problem. Kolejna szybka pomoc, jak wyświetlić zawartość w bogatym polu tekstowym, tzn. Powiedzieć pod moją strukturą widoku drzewa, mam kilka plików notatnika w momencie, gdy wybiorę dowolny notatnik lub podwójne kliknięcie powinno wyświetlić zawartość w polu richtext ... –

+0

Dzięki za twoja pomoc, właśnie wkleiłem twój kod w moim formularzu, który kompiluje bez żadnego problemu. Jednak po kliknięciu mojego pliku tekstowego wyświetlonego w moim drzewie struktura nic nie jest wyświetlana w richtextbox. Mam pewną zawartość w moim pliku tekstowym. –

+0

Dodaj pole tekstowe w formularzu i wyświetli ono zawartość pliku w twoim polu tekstowym ... –

0

Spróbuj tego: (zauważ, upewnij się, że lokalizacja DirectoryInfo zawiera kilka folderów)

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

Po prostu próbowałem twój kod nadal mam ten sam problem .. –

0

DirectoryInfo.Exists ("FileExplorer") sprawdzi „C: \ Users \ Shahul \ Documents \ Visual Studio 2010 \ Projekty \ TreeView \ TreeView \ bin \ debug \ FileExplorer ", a nie" C: \ Users \ Shahul \ Documents \ Visual Studio 2010 \ Projects \ TreeView \ TreeView \ bin \ FileExplorer ", gdy pracujesz w trybie debugowania.

0

Spróbuj wykonać następujące czynności:

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; 
    } 
} 

Lepiej podzielić się katalog parsowania do metody rekurencyjnej, aby można było przejść całą drogę w dół drzewa.

Będzie to zablokować UI, aż będzie całkowicie załadowany - ale mocujący, który jest poza zakresem tej odpowiedzi ...

:)

+0

Dziękuję za pomoc :-) Naprawiłem to –

+0

Żadnych problemów! W przyszłości poinformuj nas o tym, jeśli pracujesz z WinForm/WPF, ponieważ zajmują się one inaczej. – Chemass

+0

OK, na pewno ...... –