Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 29.05.2010
Сообщений: 16

treeviw в vb 2005

31.05.2010, 10:59. Показов 1956. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет, столкнулся с проблемой, не могу разобраться как работать с treeview в vb2005 смотрел в инете пробовал как писали не получалось vb выдавал ошибку, конкретно не могу разобраться как делать дочерние ключи. по заданию надо сделать программу которая создаёт биномиальную кучу(несколько биномиальных деревьев ключевые вершины которых соеденены) и проводит операции над ней, например: поиск минимума, удаление минимума, вставка элемента и объединение куч.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.05.2010, 10:59
Ответы с готовыми решениями:

SELECT * FROM tabl WHERE (ДатаВызова Between #21/04/2005# And #01/07/2005#); не работает
Ни кто не сталкивался с подобным глюкам. Делаю в ADoDB выборку из Recordset по дате SELECT * FROM tabl WHERE (ДатаВызова Between...

Подключение к SQL server 2005 из vs 2005
Добрый день. Пытаюсь сделать клиент с использованием ado.net для подключение к БД. На виртуальной машине установлен WinXp sp3 x86, на него...

Напечатайте календарь заданного месяца 2005 года, зная, что 1 января 2005 года — суббота
не могу понять что вообще делать в программе. Условие звучит так: Напечатайте календарь заданного месяца 2005 года, зная, что 1 января...

1
 Аватар для XudaH
13 / 13 / 0
Регистрация: 04.05.2009
Сообщений: 130
31.05.2010, 12:54
В учебнике Лукина нашёл про Treeview может быть поможет.

Заполняем TreeView в коде
Предоставим пользователю нашего приложения возможность, запустив проект, са-мому заполнять произвольное дерево, причем так, как это делается в Редакторе вершин дерева. Для этого достаточно запрограммировать работу 4 кнопок, которые вы видите на Рис. 20.16. Все кнопки действуют по отношению к любой выделенной вершине и смысл их ясен без объяснений. Текстовое поле служит для ввода названия вершины.
Но предварительно мы должны кое-что о дереве узнать. Сначала о терминологии.
Вершина – человек. От человека тянутся вниз и направо ветки к его сыновьям (так называемые дочерние вершины – Child). По отношению к сыновьям родитель является родительской вершиной (Parent). Адам – корень. Нажимая в режиме проектирования кнопку Add Root, мы можем добавить к дереву сколько угодно корней. Братья по отноше-нию друг к другу называются Sibling.
Свойства и методы дерева и вершин. Каждая вершина является объектом класса TreeNode. Каждая вершина обладает свойством – коллекцией Nodes – это дочерние вершины (только дочерние, без внуков, правнуков и более отдаленных потомков). Сколько вершин на дереве – столько и коллекций. Но некоторые коллекции – пустые (у кого-то нет детей). Каждый элемент коллекции – это тоже объект класса TreeNode, то есть вершина. Вот такая, довольно сложная, но стройная картина получа-ется.
У каждой вершины есть метод Remove – он уничтожает вершину со всеми ее потомками. Есть свойство Parent – это родительская вершина. Каждую вершину можно выделить своим цветом фона (свойство BackColor) и цветом шрифта (свойство ForeColor). Метод Expand осуществляет нажатие на плюсик у вершины, то есть показывает ее дочерние вершины. Метод ExpandAll показывает не только дочерние вершины, но всех потомков.
Также у вершины есть метод GetNodeCount, который сообщает нам количество вершин-потомков данной вершины. У метода есть булевский параметр: True указывает, что считать нужно всех потомков, False – только дочерние вершины.
Методы Expand и ExpandAll, а также GetNodeCount есть и у дерева TreeView. Здесь True указывает, что считать нужно все вершины дерева, False – только корни.
У дерева TreeView есть также свойство SelectedNode. Оно имеет своим значением выделенную вершину.
Простой вариант программы. Создайте проект с TreeView, 4 кнопками и тексто-вым полем. TreeView не заполняйте, он должен до запуска проекта быть пустым. Введите в окно кода следующие 5 процедур. Сразу же оговорюсь, что текст процедур данного варианта максимально упрощен. Я жертвовал целесообразностью и надежностью ради понятности:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        TV.Nodes.Add("Адам")
End Sub
 
Private Sub Создай_сына_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Создай_сына.Click
        Dim Вершина As New TreeNode(TextBox1.Text)
        TV.SelectedNode.Nodes.Add(Вершина)
End Sub
 
Private Sub Создай_брата_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Создай_брата.Click
        Dim Вершина As New TreeNode(TextBox1.Text)
        TV.SelectedNode.Parent.Nodes.Add(Вершина)
End Sub
 
Private Sub Переименуй_Click(ByVal sender As Object, ByVal e As EventArgs)  Handles Переименуй.Click
        TV.SelectedNode.Text = TextBox1.Text
End Sub
 
Private Sub Удали_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Удали.Click
        TV.SelectedNode.Remove()
End Sub
Пояснения: У коллекции Nodes, как и у всякой коллекции, есть метод Add, который добавляет в коллекцию элемент – объект класса TreeNode. В качестве параметра метода мы можем указать свойство Text этого объекта (в процедуре Form1_Load мы указали "Адам") или заранее созданный объект класса TreeNode (так мы делаем в других процедурах проекта).
Первой выполняется процедура Form1_Load. В пустом дереве она создает вершину Адам. Смысла в этом нет, но мне так проще объяснять.
Не надо сразу же нажимать на кнопку Удали. Поскольку кроме Адама других вершин на дереве нет, именно она и будет выбранной (выделенной темным цветом), а значит будет удалена процедурой Удали_Click. Дерево опустеет и дальше нам не с чем будет работать.
Переименуйте эту вершину, набрав текст в текстовом поле и нажав кнопку Переименуй. Поскольку кроме Адама других вершин на дереве нет, именно она и будет выбранной, а значит будет переименована процедурой Переименуй_Click.
Щелкните по кнопке Создай сына. Первым выполнится оператор
Dim Вершина As New TreeNode(TextBox1.Text)
Он создает объект Вершина класса TreeNode. Свойство Text этого объекта определяется значением параметра. У нас это текст в текстовом поле.
Вторым выполнится оператор
TV.SelectedNode.Nodes.Add(Вершина)
Поскольку выделен Адам, то к коллекции Nodes его сыновей (пустой пока), добавля-ется только что созданная вершина, что вы и увидите сразу же на экране, щелкнув по появившемуся плюсику. Щелкните по кнопке Создай сына несколько раз. На экране вы увидите несколько сыновей Адама.
Выделите одного из сыновей и щелкните по кнопке Создай сына. Теперь выделен сын и поэтому вершина будет добавлена к коллекции Nodes сына, а не Адама. На экране появится внук.
Выделяя того или иного из сыновей или внуков, щелкайте по кнопке Создай сына, предварительно вводя разный текст в текстовое поле. Вы увидите, как на дереве появ-ляются внуки, правнуки и более отдаленные потомки.
Кнопка Создай брата вроде бы ни к чему, и без нее все работает. Но она мне пригодилась для объяснения свойства Parent. Выделите одну из вершин (но не корень) и нажмите кнопку. В операторе
TV.SelectedNode.Parent.Nodes.Add(Вершина )
мы видим вот что:
TV.SelectedNode Выбранная вершина
TV.SelectedNode.Parent Родитель выбранной вершины
TV.SelectedNode.Parent.Nodes Коллекция сыновей родителя выбранной вершины, то есть братья выбранной вершины

Надежный вариант программы. Наша программа делает далеко не все, что нужно, и совсем не предохранена от «неправильных» щелчков по кнопкам. Так, нам не удастся создать брата Адаму. Удалив Адама, мы окажемся не у дел. И так далее. Пишем надежный вариант программы:
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
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim Вершина As TreeNode
        For Each Вершина In TV.Nodes
            Вершина.Remove()
        Next
End Sub
 
Private Sub Создай_сына_Click(ByVal sender As Object, ByVal e As EventArgs)  Handles Создай_сына.Click
        Dim Вершина As New TreeNode(TextBox1.Text)
        If TV.GetNodeCount(True) = 0 Then
            TV.Nodes.Add(Вершина)
            TV.Focus()
        ElseIf TV.SelectedNode Is Nothing Then
            MsgBox("Выберите вершину")
        Else
            TV.SelectedNode.Nodes.Add(Вершина)
            Вершина.Parent.Expand()
        End If
End Sub
 
Private Sub Создай_брата_Click(ByVal sender As Object, ByVal e As EventArgs)  Handles Создай_брата.Click
        Dim Вершина As New TreeNode(TextBox1.Text)
        If TV.GetNodeCount(True) = 0 Then
            TV.Nodes.Add(Вершина)
            TV.Focus()
        ElseIf TV.SelectedNode Is Nothing Then
            MsgBox("Выберите вершину")
        ElseIf TV.SelectedNode.Parent Is Nothing Then
            TV.Nodes.Add(Вершина)
        Else
            TV.SelectedNode.Parent.Nodes.Add(Вершина)
        End If
End Sub
 
Private Sub Переименуй_Click(ByVal sender As Object, ByVal e As EventArgs)  Handles Переименуй.Click
        If TV.GetNodeCount(True) = 0 Then
            MsgBox("Дерево пусто")
        ElseIf TV.SelectedNode Is Nothing Then
            MsgBox("Выберите вершину")
        Else
            TV.SelectedNode.Text = TextBox1.Text
        End If
End Sub
 
Private Sub Удали_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Удали.Click
        If TV.GetNodeCount(True) = 0 Or TV.SelectedNode Is Nothing Then Exit Sub
        TV.SelectedNode.Remove()
End Sub
Пояснения: Процедуре Form1_Load я придумал другое дело – теперь она очищает дерево, если вы его нечаянно заполнили в режиме проектирования. Поскольку метод Remove уничтожает вершину со всеми ее потомками, достаточно уничтожить все корни дерева, то есть элементы коллекции TV.Nodes, что и делается.
Теперь разберем процедуру для кнопки Переименуй. Ее работа – ключ к пониманию работы других процедур. Переименовывать имеет смысл только тогда, когда дерево не пусто и когда на дереве имеется выделенная вершина. Оператор If в этой процедуре создан для обработки именно такой ситуации, и его можно перевести так:
Если общее количество вершин дерева = 0, то
Сообщай, что дерево пусто
Иначе если не существует выбранной вершины, то
Сообщай, что надо бы выбрать вершину
Иначе
Переименовывай вершину.
Если объект не существует, то в VB говорят, что он «есть ничто», по-английски –
Is Nothing
Поэтому выражение
TV.SelectedNode Is Nothing
можно перевести, как «выбранная вершина есть ничто» или «выбранная вершина не существует».
Логика остальных кнопок ясна из их кода. Кнопки Создай сына и Создай брата при пустом дереве добавляют корень, как я и хотел. Строка
TV.Focus()
возвращает фокус на дерево, что удобно, но не обязательно.
В процедуре для кнопки Создай брата строка
ElseIf TV.SelectedNode.Parent Is Nothing Then
обрабатывает следующую ситуацию: Если у выбранной вершины не существует родителя, значит это корень, значит брат ему – тоже корень, значит создавать этого брата придется строкой
TV.Nodes.Add(Вершина)
В процедуре для кнопки Создай сына строка
Вершина.Parent.Expand()
избавляет от необходимости жать плюсик на родителе, чтобы увидеть только что созданного сына.
Прочее. Теперь было бы неплохо, чтобы работа пользователя по созданию дерева не пропала даром, а для этого нужно дать ему возможность сохранить созданное дерево, а потом загрузить. Но это нетривиальная задача. Отложите ее на будущее. Я ее разбирать не буду, но идею ее решения вы можете почерпнуть в следующем подразделе.
20.8.3. Работаем с TreeView в коде
Задача. Подсчитать, сколько человек в родословной имеют имя длиной в 4 буквы.
Задача нетривиальная. Ведь программа должна пробежаться по всем вершинам, то есть по всем коллекциям вершин. Мы с вами пробежались разик по коллекции корней в процедуре Form1_Load в предыдущем подразделе. Но как заставить программу пере-прыгнуть от отца к сыну, затем к внуку и так далее на неизвестную глубину и там делать свое дело? Это вопрос. И здесь нам на выручку приходит рекурсия (15.9). Если вы не поняли, как она работает, сейчас самое время вернуться назад и разобраться, потому что иначе вы не поймете то, что написано дальше.
Программа:
Dim K As Integer = 0 'Счетчик 4-буквенных имен

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Посчитай(TreeView1)
        Debug.WriteLine(K)
End Sub
 
Sub Посчитай(ByVal Вершина As Object)
        Dim Дочь As TreeNode
        For Each Дочь In Вершина.Nodes
            If Len(Дочь.Text) = 4 Then K = K + 1
            Посчитай(Дочь)
        Next
End Sub
Как видите, программа получилась удивительно короткой. Такова рекурсия.
Пояснения: Если объяснять подробно, то придется давать такое же длинное ступенчатое пояснение, как для факториала. Поясню коротко. Вот процедура Посчитай «входит» в какую-нибудь очередную вершину, которая является ее параметром. Цикл
For Each Дочь In Вершина.Nodes
заставляет ее для каждой своей дочерней вершины выполнить два оператора. Первый –
If Len(Дочь.Text) = 4 Then K = K + 1
собственно выполняет весь подсчет, а именно, если имя дочери состоит из 4 букв, то увеличивает счетчик. Второй оператор
Посчитай(Дочь)
и есть главный инструмент рекурсии. Он заставляет VB посчитать дочь точно так же, как только что шел подсчет для ее родителя. Там VB обнаружит внуков и так, по механизму рекурсии, обежит всех потомков вершины безо всякой головной боли с нашей стороны.
Чтобы просчитать все дерево, нам достаточно запустить процедуру Посчитай, па-раметром которой служила бы не вершина, а все дерево. Это мы как раз и делаем, щелчком по кнопке запуская процедуру Посчитай(TreeView1).
Наиболее дотошные спросят: А почему я не написал заголовок так:
Sub Посчитай(ByVal Вершина As TreeNode)
Только потому, что TreeView не является объектом класса TreeNode. Пришлось объявлять вершину более общим классом..
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
31.05.2010, 12:54
Помогаю со студенческими работами здесь

vs 2005
у кого есть VS 2005?

2005 год
полная версия отчета по исследованию рынка SEO-2005 http://seomaste.ru/seo2005.shtml

из 2010 в 2005
Подскажите, а можно как-нибудь проект, сделанный в 2010-ом вижуале, переделать под 2005?

VS 2005 и Framework 1.1
Подскажите, как в 2005-й студии собирать проекты под фреймворк 1.1?

SQL 2005
Всем привет!!! В скуле файл tempdb.mdf стал занимать 130Гб вырос буквально за неделю, с чем связанно не понятно!!!! Подскажите...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru