Дата публикации статьи: 17.01.2004 17:06

Гайдар Магдануров
Элементы управления .NET
Работа с TreeView

  • Введение
  • Краткое описание
  • Узлы и свойства
  • Свойства и события TreeView
  • Добавление/редактирование/удаление
  • Вывод
  • Пример к статье
  • Введение

    Эта статья начинает цикл коротких статей по работе с элементами управления .NET. Это достаточно странно, но именно работа со стандартными элементами отпугивает начинающих программистов. Я понимаю, насколько это сложно начинать свой путь к вершинам "программерского" искусства с такой системы, на первый взгляд сложной, как Visual Basic .NET. Поэтому-то я и начал этот цикл. К каждой статье прилагается пример, который сам по себе демонстрирует описываемые возможности и он должен служить основным источником информации - учится на примере всегда легче, чем читая что-то отвлеченное, пусть даже изобилующее кусками кода.
    Чаще всего задают вопросы по TreeView, с него и начнем. Давненько я не писал ничего для начинающих ... Посмотрим, что получится на этот раз. So, let's rock!

    Краткое описание элемента TreeView

    Элемент TreeView предназначен для отображения древовидных структур, как, например, это делает Windows Explorer (View | Explorer Bars | Folders). Основным понятием этого элемента является узел - это каждая отдельная веточка, которая содержит ссылку на родительскую веточку (parent), при условии, что это не корневой узел, тогда ссылка на родителя  равна Nothing, а также ссылки на коллекцию порожденных от него детей (child), для узла не имеющего детей эта коллекция пуста. Также каждый узел имеет свои свойства, независимые от других узлов, например такие как Text и Tag. Помимо свойств узлов, TreeView  имеет и свои собственные свойства, описывающие то, как контрол отображается на форме, как себя ведет и вообще зачем он такой нужен.

    Узлы и свойства

    Основные используемые свойства узлов - это:

    • Text - текст, отображающийся в дереве
    • Tag - любые данные, которые вы хотите присвоить этому элементу - этому свойству может быть присвоен любой объект, например текстовая строка (учтите, все типы в .NET - объекты, подробнее смотрите статьи здесь), либо экземпляр вашего собственного класса, относящийся к этому узлу, либо даже связанный с ним контрол на форме - TextBox, CommandButton и т.д.
    • Parent - объект - родительский узел.
    • Nodes - массив порожденных узлов
    • ImageIndex - индекс картинки в массиве
    • IsExpanded - булево значение в зависимости от того - развернут ли узел или нет
    • IsVisible - булево значение в зависимости от того - видим узел или нет

    Вот пока и все. Приведу пример:

    Dim myNode As TreeNode
    Dim myTag As SomeObject
    myTag = New SomeObject ' создаем некий объект
    myTag.ExecSomeMethod() ' делаем нечто, по необходимости
    myNode = New TreeNode ' создаем новый объект
    myNode.Text = "Некоторый текст" ' присваиваем текст
    myNode.Tag = myTag
    
    Свойства и события TreeView

    Основные свойства TreeView:

    • CheckBoxes - отображать или нет "поля для установки галочек"
    • HotTracking - выделять или нет узел под курсором
    • ImageList - назначенный элемент ImageList
    • LabelEdit - разрешить ли редактирование узлов
    • SelectedNode - объект - выделенный узел
    • ShowLines - отображать или нет линии
    • ShowRootLines - отображать или нет "внешние линии"
    • ShowPlusMinus - отображать или нет картинку "плюс" или "минус".
    • Nodes - массив элементов, для которых родительским является сам объект TreeView.

    Самое часто и по делу используемое свойство - SelectedNode. Благодаря ему можно узнать на каком элементе остановил свой выбор пользователь и в соответствии с этим делать какие-либо действия.

    Основные события TreeView:

    • AfterCollapse - происходит после cворачивания узла
    • AfterExpand - происходит после разворачивания узла
    • AfterSelect - происходит после выбора узла

    События происходящие до (Before) нас не интересуют.

    Пример:

        Private Sub myTreeView_AfterSelect(ByVal sender As System.Object, ByVal e As _ 
        System.Windows.Forms.TreeViewEventArgs) Handles tvMain.AfterSelect
            
             tvMain.SelectedNode.Text = "другой текст"
    
        End Sub
    Добавление/удаление/редактирование узлов

    Чтобы редактировать элемент надо сначала подумать, что собственно редактировать-то? Вероятно выделенный пользователем элемент нам изменять интереснее всего. С него и начнем.
    Прежде всего - пользователь выбирает элемент и вызывается обработчик события AfterSelect, если он, конечно, есть. После этого мы можем получить необходимый объект (и при желании "перебрать" его детей и родителей).
    Для наших действий нам понадобятся методы объекта TreeNode:

    • Collapse - сворачивает узел

    • Expand - разворачивает узел

    • Remove - удаляет узел

    • Toggle - если развернут - сворачивает, если свернут -... (вы догадались).

    • Clone - создает копию

    • GetNodeCount - возвращает количество детей у данного узла. Это метод имеет важный параметр IncludeSubTrees - учитывать ли в подсчете вложенные деревья.

    Соответственно мы можем поступать с узлом так, как нам хочется. Но чтобы получить доступ к его дочерним узлам нужно использовать свойство Nodes, как я уже говорил, это массив всех дочерних узлов. Этот массив также обладает всеми свойствами стандартного массива (на самом деле это не массив, а коллекция элементов, но о коллекциях мы поговорим в другой раз). Сейчас же нас интересуют лишь некоторые методы:

    • Add - создает новый узел (в качестве параметра воспринимает строку - свойство Text нового узла, либо уже созданный объект TreeNode)

    • Clear - очищает коллекцию элементов

    • Remove - удаляет элемент (необходимо передать объект TreeNode)

    • RemoveAt - удаляет элемент с индексом (необходимо передать объект Integer)

    • Contains - проверяет принадлежит ли переданный в качестве параметра элемент данной коллекции

    Пример:

    Dim newNode As TreeNode
    Dim anotherNode As TreeNode
    newNode = myTreeView.SelectedNode.Nodes.Add("Новый узел") ‘ Создание узла 
    ‘ можно создавать иначе
    newNode = myTreeView.SelectedNode.Nodes.Add(anotherNode)
    ‘ удаляем вообще все узлы
    myTreeView.Nodes.Clear()
    Заключение

    Вот и все на этом. Это лишь краткое описание основных свойств, методов и понятий. За более подробной информацией следует обращаться к лучшему други и помошнику программиста - Object Browser (Ctrl+Alt+J).

    Я принимаю пожелания и предложения по тому о чем надо написать следующую статью. Мой адрес как всегда "не дом и не улица", а gaidar@vbstreets.ru.

     

    Благодарность

    Я очень благодарен своей любимой девушке за ценные замечания по данной статье. Помощь была действительно ценной, без нее в статье было бы несколько весьма темных моментов, которые я выпустил из вида. Спасибо тебе, любовь моя.