Елемент TreeView у Visual Basic

Отже, почнемо із того, що таке TreeView?

Відкрийте Explorer (якщо у вас, звичайно, Windows :)) - зліва, як ви здогадалися, TreeView, а праворуч - ListView (це я так просто говорю). Елемент TreeView забезпечує засоби зберігання ієрархічно структурованих даних Для зберігання малюнків (таких як папка, прапор Віндів для невизначеного типу файлів тощо) використовується елемент ImageList - робота з ним досить проста, і торкатися цієї теми поки не будемо: Відкриємо нову форму і створимо елемент TreeView, який перебуває під контролем MS Windows Common Controls. Створимо також CommandButton, у події Click якого ми і все описуватимемо.

Спочатку теорія. У цьому елементі реалізована структура даних, відома як дерево, а кожен елемент дерева називається вузлом (node). Верхній вузол дерева називають кореневим вузлом (root node), а вузли нижче – дочірніми вузлами (child nodes). Розглянемо це на структурі Інтернету: домен ru – кореневий вузол, а домен narod для ru – дочірній вузол. Домен narod для soobcha-vb домену є батьківським. Із цим, я думаю, все зрозуміло.

Тепер подивимося властивості елемента TreeView: щоб він виглядав як провідник, треба поставити значення Style 7, а LineStyle - 0. Там ще багато властивостей, і я думаю, всі їх описувати не потрібно - багато з них стандартні.

Тепер перейдемо у вікно коду та наберемо TreeView1.Nodes, а далі поставимо крапку. Побачили: до сімейства Nodes входять 5 компонентів, з якими і належить працювати. Почнемо з основного та найскладнішого: Add.

Зробимо кореневий вузол:

TreeView1.Nodes.Add , , "Internet", "Internet"

Запустимо програму та натиснемо на кнопку – побачили? - так, з'явився вузол Інтернету. Але поки нічого не зрозуміло - навіщо стільки ком і два 'Інтернети'. Давайтепродовжимо створювати вузли, і все стане зрозумілим! Введемо:

TreeView1.Nodes.Add "Internet", tvwChild, "ru", "ru"

Ввели, а тепер натискаємо на старт і кнопку, і якщо ви все акуратно ввели, або скопіювали звідси, то з'явилася помилка. Починаємо розумітися: що ж ми хотіли зробити? Створити дочірній вузол RU до кореневого Інтернету - на це вказує значення tvwChild - я думаю, воно зрозуміло. Але звідки помилка? Після цього ми все ввели правильно, адже перший рядок працював. Залишилося одне значення – Internet. Ну, здогадалися? Саме, у першому рядку, якщо ви уважно стежили за роботою програми, у TreeView з'явилося Internet (з великої літери), а internet (з маленької) - це лише ключ. І на другому рядку ми вказуємо не пряме ім'я, а ключ цього імені, тобто. Інтернет. Виправимо, запустимо, клацнемо подвійним кліком на Internet - і ось він, дочірній вузол ru. Створимо, відповідно, ще пару доменів 1 рівня:

TreeView1.Nodes.Add "Internet", tvwChild, "com", "com" TreeView1.Nodes.Add "Internet", tvwChild, "net", "net" TreeView1.Nodes.Add "Internet" , tvwChild, "edu", "edu"

Вам не набридло постійно клацати по Internet, так? - Ну, введемо:

Складно – а хто казав, що просто? Ось ми частково познайомились із компонентом Item. Ну, додамо ще пару дочірніх вузлів до ru, тут уже все зрозуміло - ви самі можете зробити це.

TreeView1.Nodes.Add "ru", tvwChild, "narod", "narod" 'слідуючи від дочірнього вузла до батьківського, ви потрапите на сайт Народ.ру TreeView1.Nodes.Add "narod", tvwChild, "www", "www" 'а виходячи звідси, потрапите на сайт, звідки ви це читаєте TreeView1.Nodes.Add "narod", tvwChild, "soobcha-vb", "soobcha-vb">TreeView1.Nodes.Add "ru", tvwChild, "boom", "boom" TreeView1.Nodes.Add "ru", tvwChild, "lgg", "lgg"

Тепер зробимо шлях до іншого сайту безкоштовного хостингу - www.boom.ru Все, напевно, запровадять

TreeView1.Nodes.Add "boom", tvwChild, "www", "www"

І знову помилка! Просто ви вже звикли, що ключ збігається (принаймні, за значенням – пам'ятаєте історію з регістром?). Але ж не може бути два однакові ключі - як тоді додавати дочірні вузли? У зв'язку з цим потрібно скористатися 'повним' шляхом до вузла, тобто. для ru – це було б internet-ru, для www.narod.ru – internet-ru-narod-www. Тут збігів не може. Переваги і того, і іншого варіанта ви зрозумієте з часом: якщо ви впевнені, що будуть відсутні два вузли з однаковими іменами (хоча таке буває рідко), то є сенс залишити початковий варіант, а в іншому випадку необхідно використовувати 'повний' шлях. Отримали такий код:

TreeView1.Nodes.Add , , "Internet", "Internet" TreeView1.Nodes.Add "Internet", tvwChild, "Internet-ru", "ru" TreeView1.Nodes.Add "Internet", tvwChild , "internet-com", "com" TreeView1.Nodes.Add "internet", tvwChild, "internet-net", "net" TreeView1.Nodes.Add "internet", tvwChild, "internet- edu", "edu" TreeView1.Nodes.Item("internet"). TreeView1.Nodes.Add "Internet-ru-narod", tvwChild, "Internet-ru-narod-www", "www" TreeView1.Nodes.Add "Internet-ru-narod", tvwChild, " internet-ru-narod-soobcha-vb" _ , "soobcha-vb" TreeView1.Nodes.Add "internet-ru", tvwChild, "internet-ru-boom", "boom" TreeView1.Nodes.Add "internet-ru-boom", tvwChild, "internet-ru-boom-www", "www" TreeView1.Nodes.Add "internet-ru", tvwChild, "internet-ru-lgg ", "lgg" TreeView1.Nodes.Add "internet-ru-lgg", tvwChild, "internet-ru-lgg-www", "www"

Складно, на перший погляд, але ми отримали таку складну структуру: Тепер поговоримо про інші компоненти Nodes: Count - повертає число вузлів сімейства Nodes. Введемо:

У нас з'явиться в віконці кількість вузлів – у даному випадку 12. Ви випадково жодного разу не натискали на кнопку ще раз? - правильно, виникає помилка, т.к. ключі вже створені, і такі значення вже є. Поставте на початку:

І перед додаванням нових значень TreeView повністю очищатиметься. А якщо у процесі роботи програми треба видалити вузол? - Правильно, треба скористатися командою Remove:

Видаляємо вузол ru, котрий ми так довго створювали.

А тепер трохи про картинки:

TreeView1.Nodes.Add "Internet", tvwChild, "Internet-org", "org", _ App.Path & \pic1.bmp, App.Path & "\pic1sel.bmp"

Таким чином показується картинка, яка знаходиться в папці, де у вас збережена ця програма (або ви її ще не зберегли?), з ім'ям pic1.bmp, і якщо вузол вибраний, то з ім'ям pic1sel.bmp. Просто так? А ось те саме, тільки з використанням ImageList (він знаходиться в MS Windows Common Controls-2):

ImageList1.ListImages.Add , , LoadPicture(App.Path & "\pic1.bmp") ImageList1.ListImages.Add , , LoadPicture(App.Path & "\pic1sel.bmp") TreeView1. ImageList = ImageList1 TreeView1.Nodes.Add "Internet", tvwChild, "Internet-org", "org", 1, 2

Номери надаються по порядку, але можна і задавати ключ. Набагато довше, але якщо ви хочете зробити малюнки для своїх папок, а їх 100 штук, то невже ви щоразу прописуватимете шлях до файлу?

Ось ми скрізь пишемо tvwChild, а невже не можна інакше? Може, я хочу вставити слідом чи до деякого вузла новий – немає проблем.

TreeView1.Nodes.Add "Internet-com",tvwNext, "internet-tv", "tv"

Додати після домену com домен tv, а якщо перед? - Правильно:

TreeView1.Nodes.Add "Internet-com", tvwPrevious, "Internet-su", "su"

А хочете першим поставити новий вузол:

TreeView1.Nodes.Add "Internet-com", tvwFirst, "Internet-to", "to"

TreeView1.Nodes.Add "Internet-com", tvwLast, "Internet-med", "med"

Ось і закінчилися варіанти:

Тут я навів лише опис TreeView, методи роботи з ним, такі як пошук, збереження, завантаження, набагато складніше.