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

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

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

Author24 — интернет-сервис помощи студентам
Доброго времени суток. Нужно создать форму со списком папок и файлов в 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)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.11.2014, 01:45
Ответы с готовыми решениями:

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

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

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

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

5
Почетный модератор
21413 / 9147 / 1083
Регистрация: 11.04.2010
Сообщений: 11,014
26.11.2014, 04:17 2
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
211 / 228 / 87
Регистрация: 21.04.2013
Сообщений: 404
26.11.2014, 16:55  [ТС] 3
Цитата Сообщение от Памирыч Посмотреть сообщение
TreeView1.Nodes.Find("Gif", True)
Памирыч, не работает. Там, похоже, надо искать ноды в нодах, т.е. типа: TreeView1.Nodes(0).Nodes.Find("Gif", True)
Т.е. рекурсия, в которой я (надеюсь, что только пока) слабо разбираюсь. Плюс, вроде, дерево в данном варианте строится динамически при разворачивании нодов.
0
Почетный модератор
21413 / 9147 / 1083
Регистрация: 11.04.2010
Сообщений: 11,014
27.11.2014, 11:05 4
Цитата Сообщение от Petr_S Посмотреть сообщение
рекурсия
Да, это и есть метод Find
Это как Directory.GetFiles и рекурсия, написанная программистом

Цитата Сообщение от Petr_S Посмотреть сообщение
Плюс, вроде, дерево в данном варианте строится динамически при разворачивании нодов
Если это так, то искать там нечего, потому и не находит
0
1590 / 663 / 225
Регистрация: 09.06.2011
Сообщений: 1,334
27.11.2014, 13:55 5
Лучший ответ Сообщение было отмечено 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
211 / 228 / 87
Регистрация: 21.04.2013
Сообщений: 404
28.11.2014, 18:36  [ТС] 6
Step_UA, благодарю!
0
28.11.2014, 18:36
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.11.2014, 18:36
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru