2014-01-28 3 views
0

После прочистки интернета, чтобы сделать это, насколько это возможно, я не смог найти что-то, что работало для меня. Я взял кодировку от this question, пытаясь заставить ее работать, но не могу понять, как спасти мою жизнь. Вот что у меня есть:Отображение СПЕЦИФИЧЕСКИХ папок/файлов в treeview

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 

    'Get a list of drives 
    Dim drives As System.Collections.ObjectModel.ReadOnlyCollection(Of DriveInfo) = My.Computer.FileSystem.Drives 
    Dim rootDir As String = String.empty 
    'Now loop thru each drive and populate the treeview 
    For i As Integer = 0 To drives.Count - 1 
     rootDir = drives(i).Name 
     'Add this drive as a root node 
     TreeView1.Nodes.Add(rootDir) 
     'Populate this root node 
     PopulateTreeView(rootDir, TreeView1.Nodes(i)) 
    Next 

End Sub 

Private Sub PopulateTreeView(ByVal dir As String, ByVal parentNode As TreeNode) 
    Dim folder As String = String.Empty 
    Try 
     Dim folders() As String = IO.Directory.GetDirectories(dir) 
     If folders.Length <> 0 Then 
      Dim childNode As TreeNode = Nothing 
      For Each folder In folders 
       childNode = New TreeNode(folder) 
       parentNode.Nodes.Add(childNode) 
       PopulateTreeView(folder, childNode) 
      Next 
     End If 
    Catch ex As UnauthorizedAccessException 
     parentNode.Nodes.Add(folder & ": Access Denied") 
    End Try 
End Sub 

Однако это только перечисляет диски & свои папки и мне нужно, чтобы список каталогов и файлов из определенного каталога с самого начала, не имея, чтобы пройти весь путь вниз по дереву чтобы найти то, что вы специально ищете. Я попытался изменить rootDir на адрес конкретной папки, к которой я пытаюсь получить доступ, но безрезультатно. У кого-нибудь есть предложения?

+0

Вы пытаетесь отображать папки или файлы только для расширенных родителей? Ваша текущая реализация перечислит каждый файл в каждой папке на всей машине. Это происходит навсегда. Почему бы вам не начать с каталогов верхнего уровня и «PopulateTreeView», когда пользователь нажимает, чтобы развернуть его? Гораздо быстрее и менее интенсивно все сразу. – Brandon

+0

Что я пытаюсь сделать, это взять код выше, и он работает для определенного пути, а не для всех дисков. –

+0

Код выше уже будет работать по определенному пути. Вызовите PopulateTreeView следующим образом: 'PopulateTreeView (yourPath, TreeView1.Nodes (0))'. Посмотрите на мой ответ ниже, вы заметите, что он делает это для определенного пути и запускается при нажатии. – Brandon

ответ

2

Я не уверен, что я понимаю вопрос, но на основе моего комментария в исходном вопросе: этот код будет делать то, что я сказал в этом комментарии. Это написано на C# but here is a converter. Также: это, вероятно, не производство готово, но это начало.

private void Form1_Load(System.Object sender, System.EventArgs e) 
    { 
     //Get a list of drives 
     DriveInfo[] drives = DriveInfo.GetDrives(); 
     string rootDir = string.Empty; 
     //Now loop thru each drive and populate the treeview 
     for (int i = 0; i <= drives.Length - 1; i++) 
     { 
      rootDir = drives[i].Name; 
      //Add this drive as a root node 
      TreeView1.Nodes.Add(rootDir); 
      //Populate this root node 
      PopulateTreeView(rootDir, TreeView1.Nodes[i]); 
     } 

    } 
    private void PopulateTreeView(string dir, TreeNode parentNode) 
    { 
     string folder = string.Empty; 
     try 
     { 
      string[] folders = System.IO.Directory.GetDirectories(dir); 
      if (folders.Length != 0) 
      { 
       TreeNode childNode = null; 
       foreach (string folder_loopVariable in folders) 
       { 
        folder = folder_loopVariable; 
        childNode = new TreeNode(folder); 
        childNode.Nodes.Add(""); 
        parentNode.Nodes.Add(childNode); 
       } 
      } 
      string[] files = System.IO.Directory.GetFiles(dir); 
      if (files.Length != 0) 
      { 
       TreeNode childNode = null; 
       foreach (string file in files) 
       { 
        childNode = new TreeNode(file); 
        parentNode.Nodes.Add(childNode); 
       } 
      } 
     } 
     catch (UnauthorizedAccessException ex) 
     { 
      parentNode.Nodes.Add(folder + ": Access Denied"); 
     } 
    } 

    private void TreeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e) 
    { 
     TreeNode actual = e.Node; 
     actual.Nodes[0].Remove(); 
     PopulateTreeView(actual.Text, actual); 
    } 

    private void TreeView1_BeforeCollapse(object sender, TreeViewCancelEventArgs e) 
    { 
     TreeNode actual = e.Node; 
     actual.Nodes.Clear(); 
     actual.Nodes.Add(""); 

    } 
+0

Спасибо Брэндон! Это работает для того, что мне нужно, после того, как я его преобразовал, никаких проблем вообще. Одна вещь, с которой у меня возникают проблемы, но это, вероятно, что-то очень просто исправить, я просто слишком тупой, чтобы понять это, поэтому она будет перечислять только одну папку. Пример: в нем перечислены диски, я расширяю один из дисков, перечисляет папки/файлы, я расширяю папку, ничего не отображается. Любые указатели? –

+0

Так было странно. У меня есть все, что я помогал людям в S.O. в одном проекте, чтобы я мог вернуться и ссылаться на него позже (по этой причине). Я расколол вашу проблему (которая работала изначально), и внезапно я столкнулся с проблемой, которую вы описали ... Предполагаю, вы скопировали и вставили мой код? Поскольку вы находитесь на C#, редактор формы автоматически не подключит код обработки событий для формирования элементов управления. Нажмите на свое дерево в дизайнере, выберите молнию на вкладке свойств и измените «BeforeCollapse» и «BeforeExpand» на методы void, скопированные сверху. – Brandon

+0

О, а также: если мой ответ был принятым ответом, не забудьте принять его в качестве ответа на ваш вопрос;) – Brandon

Смежные вопросы