Гайдар Магдануров
Элементы управления .NET
Работа с TreeView
Эта статья начинает цикл коротких статей по работе с элементами управления .NET. Это достаточно странно, но именно работа со стандартными элементами отпугивает начинающих программистов. Я понимаю, насколько это сложно начинать свой путь к вершинам "программерского" искусства с такой системы, на первый взгляд сложной, как Visual Basic .NET. Поэтому-то я и начал этот цикл. К каждой статье прилагается пример, который сам по себе демонстрирует описываемые возможности и он должен служить основным источником информации - учится на примере всегда легче, чем читая что-то отвлеченное, пусть даже изобилующее кусками кода.
Чаще всего задают вопросы по TreeView, с него и начнем. Давненько я не писал ничего для начинающих ... Посмотрим, что получится на этот раз. So, let's rock!
Элемент 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:
- 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.
Благодарность
Я очень благодарен своей любимой девушке за ценные замечания
по данной статье. Помощь была действительно ценной, без нее в статье было бы
несколько весьма темных моментов, которые я выпустил из вида. Спасибо тебе,
любовь моя.