Отправляет email-рассылки с помощью сервиса Sendsay

Visual Basic.NET. Уроки

  Все выпуски  

Visual Basic.NET. Уроки


Информационный Канал Subscribe.Ru

Уроки по Visual Basic.NET. Рассылки сайта progs.biz
Рассылка № 61
 
Начало > VB.NET > Windows > Урок 27

М. Макдональд. Рецепты программирования на Visual Basic.NET.
М. Макдональд. Рецепты программирования на Visual Basic.NET.
Заказать на Озоне

Подробнее


Полные версии уроков (с картинками): урок 27.

VB.NET для Windows
Урок 27. Продолжение класса для дерева каталогов

Продолжаем писать класс для дерева каталогов.

На прошлом уроке мы добавили в наш класс перегруженный метод OnBeforeExpand, в котором мы вызывали не написанный на то время метод NodeExpand. Вот сейчас мы этод метод и напишем. Вот его код:

    Private Sub NodeExpand(ByVal tn As TreeNode)
        ' Если есть подузлы.
        If (tn.Nodes.Count <> 0) Then
            ' Если раскрываем в первый раз.
            If Convert.ToString(tn.Tag) = "" Then
                ' Удаляем фиктивный узел.
                tn.Nodes.RemoveAt(0)
                ' Добавляем подузлы.
                AddTreeNodes(tn)
                ' Устнавливаем признак того, что
                ' узел уже раскрывали и добавили в него все подузлы.
                tn.Tag = "+"
            End If
        End If
    End Sub

Тут мы заполняем узел реальными папками, если раскрываем его в первый раз. Обратите внимание, как мы проверяем, что узел раскрывается в первый раз - для тех узлов, которые еще не раскрывались, мы будем добавлять в методе AddTreeNodes (его мы напишем ниже) фиктивный узел, по наличию которого мы и определим, раскрывался узел уже или нет. И когда узел ракрывается в первый раз, мы этот фиктивный узел уничтожаем и добавляем узлы, соответствующие именам реальных подпапок.

Пишем теперь метод AddTreeNodes:

    ' Добавление подузлов.
    Private Sub AddTreeNodes(ByVal tn As TreeNode)
        Dim aux As TreeNode
        ' Получаем полный путь для папки узла.
        Dim d As DirectoryInfo = New DirectoryInfo(GetFullPath(tn))
        ' Массив для хранения подпапок.
        Dim ds As DirectoryInfo()
        Try
            ' Получаем все подпапки для папки.
            ds = d.GetDirectories()
            Dim s As DirectoryInfo
            For Each s In ds
                ' Добавляем каждую подпапку.
                aux = tn.Nodes.Add(s.Name)
                ' Устанавливаем для нее признак, что ее еще не раскрывали.
                aux.Tag = ""

                Try
                    ' Если она не пуста, то добавляем в нее фиктивный узел.
                    If (s.GetDirectories().GetLength(0) <> 0) Then
                        aux.Nodes.Add("")
                    End If
                    ' Перехватываем исключение запрещенного доступа.
                Catch e As UnauthorizedAccessException
                End Try
            Next
            ' Перехват общего исключения (например, если диск a: не вставлен).
        Catch e As Exception
        End Try
    End Sub

Пояснения по приведенному коду. Сначала мы выясняем, для какой папки в файловой системе мы будем искать все подпапки. Для этого мы используем (опять же пока не написанную нами) функцию GetFullPath. Она по узлу в нашем дереве возвращает полный путь папки, соответсвующей этому узлу. Далее мы получаем все подпапки и проверяем, не пуста ли она. Если она пуста, то мы ничего не делаем, а если не пуста, то мы добывяем в нее фиктивный узел (чтобы плюсик появился), который при первом раскрытии мы удалим (см. предыдущую функцию NodeExpand).

Также обратите внимание, что мы делаем обработку ошибок (блок Try-Catch). Это мы делаем для избавления от разных неприятностей, связанных с невставленной дискетой или с запретом на просмотр той или иной папки.

Нам осталось добавить небольшую функцию, позвращающую по узлу дерева полный путь к папке, соответствующей этому узлу. Вот она:

    'Получение полного имени папки по узлу.
    Private Function GetFullPath(ByVal tn As TreeNode) As String
        ' Устанавливаем текуший узел на переданный в параметре.
        Dim currNode As TreeNode = tn
        ' В полное имя пока записываем текст,
        ' показываемый в текущем узле.
        Dim fullPath As String = currNode.Text

        ' Двигаемся к корню дерева.
        While Not (currNode.Parent Is Nothing)
            ' Переходим на родительский узел.
            currNode = currNode.Parent
            ' К полному имени приписываем текст родитеского узла.
            fullPath = currNode.Text + "\" + fullPath
        End While
        ' Возвращаем полный путь.
        Return fullPath + "\"
    End Function

Она должна быть понятна из комментариев.

Рассылки сайта progs.biz
Visual C++, MFC
C# и .NET
VB.NET
Win API
C/C++
Delphi
Java
HTML, PHP, mySQL, WEB-дизайн
Flash MX new!
C++ Builder
Ассемблер
SQL Server
DirectX
Обзор книг
Обзор программ
Новости сайта progs.biz


PARKING.RU. Качественный ВИРТУАЛЬНЫЙ ХОСТИНГ на платформе Windows(r): поддержка NET, многофункциональная панель управления, аренда бизнес-приложений, сертифицированные специалисты. Управляемый ВЫДЕЛЕННЫЙ ХОСТИНГ на платформе Windows(r): производительные серверы, профессиональная поддержка, аренда ПО Microsoft(r), безопасность, гарантии. http://www.parking.ru


Копирование любых материалов сайта без разрешения авторов и владельцев сайта запрещено.
© 2002-2004 сайт progs.biz
© 2002-2004 Алексеев Игорь

http://subscribe.ru/
http://subscribe.ru/feedback/
Подписан адрес:
Код этой рассылки: comp.soft.prog.vblessons
Отписаться

В избранное