Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/13: Рейтинг темы: голосов - 13, средняя оценка - 5.00
 Аватар для Petr_S
213 / 230 / 87
Регистрация: 21.04.2013
Сообщений: 404

TreeView дерево папок. Как перейти к определенной папке

26.11.2014, 01:45. Показов 2884. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток. Нужно создать форму со списком папок и файлов в TreeView.
В сети нашел решение.
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
Imports System.Runtime.InteropServices
Imports System.IO
 
Public Class Form1
 
    Private TreeView1 As TreeView
    Private Button1 As Button
    Private ImageList1 As New ImageList
 
    <StructLayout(LayoutKind.Sequential)> _
    Public Structure SHFILEINFO
        Public hIcon As IntPtr
        Public iIcon As IntPtr
        Public dwAttributes As UInteger
        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=260)> _
        Public szDisplayName As String
        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=80)> _
        Public szTypeName As String
    End Structure
 
    Private Class Win32
        Public Const SHGFI_ICON As UInteger = &H100
        Public Const SHGFI_LARGEICON As UInteger = &H0
        Public Const SHGFI_SMALLICON As UInteger = &H1
        <DllImport("shell32.dll")> _
        Public Shared Function SHGetFileInfo(ByVal pszPath As String, ByVal dwFileAttributes As UInteger, ByRef psfi As SHFILEINFO, ByVal cbSizeFileInfo As UInteger, ByVal uFlags As UInteger) As IntPtr
        End Function
    End Class
 
 
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.Size = New Size(512, 512)
 
        TreeView1 = New TreeView With {.ImageList = ImageList1, _
                                       .Location = New Point(5, 5), _
                                       .Size = New Size(500, 400)}
        AddHandler TreeView1.BeforeExpand, AddressOf treeView1_BeforeExpand
        AddHandler TreeView1.NodeMouseDoubleClick, AddressOf treeView1_NodeMouseDoubleClick
        Me.Controls.Add(TreeView1)
 
        Button1 = New Button With {.Location = New Point(10, 430)}
        AddHandler Button1.Click, AddressOf Button1_Click
        Me.Controls.Add(Button1)
 
        GetAllDrives()
    End Sub
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
 
    End Sub
 
 
    Private Sub GetAllDrives()
        Dim drives As DriveInfo() = DriveInfo.GetDrives()
        For Each drive As DriveInfo In drives
            Dim rootTreeNode As New TreeNode()
            rootTreeNode.Text = drive.Name
            rootTreeNode.Tag = drive.Name
            rootTreeNode.ImageIndex = GetIconOfFile_Folder(drive.Name)
            rootTreeNode.SelectedImageIndex = rootTreeNode.ImageIndex
            rootTreeNode.Nodes.Add(" ")
            TreeView1.Nodes.Add(rootTreeNode)
        Next
    End Sub
 
    Private Function GetIconOfFile_Folder(ByVal Path As String) As Integer
        Dim hImgSmall As IntPtr
        Dim shinfo As New SHFILEINFO()
        hImgSmall = Win32.SHGetFileInfo(Path, 0, shinfo, CUInt(Marshal.SizeOf(shinfo)), Win32.SHGFI_ICON Or Win32.SHGFI_SMALLICON)
        Dim myIcon As System.Drawing.Icon = System.Drawing.Icon.FromHandle(shinfo.hIcon)
        ImageList1.Images.Add(myIcon)
        Return ImageList1.Images.Count - 1
    End Function
 
    Private Sub treeView1_BeforeExpand(ByVal sender As Object, ByVal e As TreeViewCancelEventArgs)
        e.Node.Nodes.Clear()
        GetFilesAndFolder(e.Node, DirectCast(e.Node.Tag, String))
    End Sub
 
    Private Sub GetFilesAndFolder(ByVal tn As TreeNode, ByVal Path As String)
        Try
            Dim Directories As String() = Directory.GetDirectories(Path)
            Dim Files As String() = Directory.GetFiles(Path)
 
            For Each dir As String In Directories
                Dim dirTreeNode As New TreeNode()
                dirTreeNode.Tag = dir
                dirTreeNode.Text = New DirectoryInfo(dir).Name
                dirTreeNode.ImageIndex = GetIconOfFile_Folder(dir)
                dirTreeNode.SelectedImageIndex = dirTreeNode.ImageIndex
                dirTreeNode.Nodes.Add(" ")
                tn.Nodes.Add(dirTreeNode)
            Next
 
            For Each file As String In Files
                Dim fileTreeNode As New TreeNode()
                fileTreeNode.Tag = file
                fileTreeNode.Text = New FileInfo(file).Name
                fileTreeNode.ImageIndex = GetIconOfFile_Folder(file)
                fileTreeNode.SelectedImageIndex = fileTreeNode.ImageIndex
                tn.Nodes.Add(fileTreeNode)
            Next
        Catch ex As Exception
            MessageBox.Show(ex.Message, ex.Source, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
        End Try
    End Sub
 
    Private Sub treeView1_NodeMouseDoubleClick(ByVal sender As Object, ByVal e As TreeNodeMouseClickEventArgs)
        If CheckIfPathIsFile(e.Node.Tag.ToString()) = True Then
            MsgBox(e.Node.Tag.ToString())
        End If
    End Sub
 
    Private Function CheckIfPathIsFile(ByVal Path As String) As Boolean
        Dim attr As FileAttributes = File.GetAttributes(Path)
        If (attr And FileAttributes.Directory) = FileAttributes.Directory Then
            Return False
        Else
            Return True
        End If
    End Function
End Class
С TreeView никогда ранее не работал. Не знаю как сделать, чтобы при нажатии Button1 курсор в TreeView установился на определенную папку. Например, на папку MyDocuments
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.11.2014, 01:45
Ответы с готовыми решениями:

Как создать разом ярлыки для всех папок и файлов, находящихся в определённой папке?
Есть папка в ней ещё много папок и под папок и разные файлы. Как разом создать ярлыки для все папок и файлов? Чтобы получить своего...

TreeView отображающий дерево папок
Есть папка &quot;Nado&quot; - &quot;начальная&quot; (на скриншоте папка &quot;Nado&quot; отображена как &quot;1&quot;) Мне надо что бы Из этой папки отображались следующие...

Открытие файла из treeview, представляющего собой дерево файлов и папок
Здравствуйте! При нажатии на кнопочку строится дерево файлов и папок. Вопрос, как мне реализовать кнопку открытия выбранного из дерева txt...

5
Почетный модератор
 Аватар для Памирыч
23251 / 9163 / 1084
Регистрация: 11.04.2010
Сообщений: 11,014
26.11.2014, 04:17
Petr_S, есть такой способ поиска в дереве:

VB.NET
1
2
3
        Dim nodeArray() As TreeNode = TreeView1.Nodes.Find("Gif", True)
        TreeView1.SelectedNode = nodeArray(0)
        TreeView1.Focus()
Смысл его, как Вы понимаете, в том, что ищем ноду по ее имени и создаем массив из найденных элементов.
В примере работаем с первой найденной и без отлова ошибки, которая может случиться, если ничего не найдено.

Однако этот способ предполагает поиск по имени ноды, но не по ее тексту.

При построении дерева просто записывайте свойство узлов .Name тем же значением, что и .Text

В моем случае это рекурсивный метод

VB.NET
1
2
3
4
5
6
7
8
9
10
    Sub Search(ByVal Fol As String, ByVal Node As TreeNode)
        For Each S As String In IO.Directory.GetDirectories(Fol, "*.*", SearchOption.TopDirectoryOnly)
            Dim TmpNode As New TreeNode(IO.Path.GetFileName(S))
            TmpNode.ImageIndex = 0
            TmpNode.Name = TmpNode.Text
            Node.Nodes.Add(TmpNode)
 
            Search(S, TmpNode)
        Next
    End Sub
0
 Аватар для Petr_S
213 / 230 / 87
Регистрация: 21.04.2013
Сообщений: 404
26.11.2014, 16:55  [ТС]
Цитата Сообщение от Памирыч Посмотреть сообщение
TreeView1.Nodes.Find("Gif", True)
Памирыч, не работает. Там, похоже, надо искать ноды в нодах, т.е. типа: TreeView1.Nodes(0).Nodes.Find("Gif", True)
Т.е. рекурсия, в которой я (надеюсь, что только пока) слабо разбираюсь. Плюс, вроде, дерево в данном варианте строится динамически при разворачивании нодов.
0
Почетный модератор
 Аватар для Памирыч
23251 / 9163 / 1084
Регистрация: 11.04.2010
Сообщений: 11,014
27.11.2014, 11:05
Цитата Сообщение от Petr_S Посмотреть сообщение
рекурсия
Да, это и есть метод Find
Это как Directory.GetFiles и рекурсия, написанная программистом

Цитата Сообщение от Petr_S Посмотреть сообщение
Плюс, вроде, дерево в данном варианте строится динамически при разворачивании нодов
Если это так, то искать там нечего, потому и не находит
0
 Аватар для Step_UA
1591 / 664 / 225
Регистрация: 09.06.2011
Сообщений: 1,334
27.11.2014, 13:55
Лучший ответ Сообщение было отмечено Petr_S как решение

Решение

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
        Dim sDir = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments).Split("\")
        Dim Node = FindNode(TreeView1.Nodes, sDir(0) + "\")
        Try
            For i = 1 To sDir.GetUpperBound(0)
                If Node.IsExpanded = False Then Node.Expand()
                Node = FindNode(Node.Nodes, sDir(i))
            Next
        Catch
        End Try
        TreeView1.SelectedNode = Node
        TreeView1.Focus()
    End Sub
 
    Private Function FindNode(ByVal NC As TreeNodeCollection, ByVal t As String) As TreeNode
        For Each N As TreeNode In NC
            If N.Text = t Then Return N
        Next
        Return Nothing
    End Function
1
 Аватар для Petr_S
213 / 230 / 87
Регистрация: 21.04.2013
Сообщений: 404
28.11.2014, 18:36  [ТС]
Step_UA, благодарю!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.11.2014, 18:36
Помогаю со студенческими работами здесь

TreeView как перейти в нужный узел
Друзья,есть компонент TreeView как перейти в его нужный узел программно, щелкнув в stringgrid ячейку с категорией и далее открылся узел...

В папке нахотится неизвестное количество папок, а в каждой из папок по одному текстовому файлу...
Ребята помогите пожалуйста! У меня такая задача: в папке нахотится неизвестное количество папок, а в каждой из папок по одному текстоваму...

Получить md5 папок в папке и пропустить несколько папок
Доброго времени суток.Делаю проверку папок и вложенных в них папок по md5.Всего нужно проверить 3 папки(имена известны) в каждой папке по 3...

как узнать количество папок в папке
Здраствуйте Подскажите пожалуйста хочу сделать смену шаблона хочу сделать while\for на количество папок( с их названиями) Пример...

Как в word-е перейти в начало определенной строки, если положение курсора не известно?
Как в word-е перейти в начало определенной строки, если положение курсора не известно?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru