Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
2285 / 1601 / 400
Регистрация: 26.06.2017
Сообщений: 4,744
Записей в блоге: 1

Коллекция узлов TreeView и передача аргументов

09.05.2019, 13:55. Показов 1942. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Итак, опять я в недоумении.
Перед добавлением нового узла в TreeView выполняется некая проверка (функцией GetBusyNumbers) на существование узла с параметрами вновь добавляемого. Так вот, если в функцию передаётся ссылка на узел (ByRef cNode As TreeNode), то после отработки функции GetBusyNumbers в дереве узлов появляется дубль последнего созданного узла, а если передать значение через ByVal, то добавление узла не происходит. Почему так? Откуда появляется дубль последнего узла?

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Private Function GetBusyNumbers(ByVal cNode As TreeNode) As Byte
        Dim inBt As Byte
        Dim NodesCollection As TreeNodeCollection 'Коллекция узлов для обработки
 
        If cNode.Parent Is Nothing Then
            NodesCollection = cNode.TreeView.Nodes
        Else
            NodesCollection = cNode.Parent.Nodes
        End If
 
        For Each nod As TreeNode In NodesCollection
            ... 'Здесь назначается inBt
        Next
 
        Return inBt
End Function
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.05.2019, 13:55
Ответы с готовыми решениями:

TreeView и коллекция моего класса
Добрый день. Предположим существует класс. class S { string name; //ноды верхнего уровня int arr; //субноды } ...

Музыкальная коллекция. taglib treeview QAbstractItemModel
Добрый день! Нашел в сети такой вот редактор тегов - http://code.google.com/p/qtagger/ Десять раз прочитал документацию -...

Иконки узлов TreeView
У меня есть TreeView.У каждого узла есть иконка: узел, который без подузлов, у того одна иконка, а узел, у которого есть дочерние узлы. у...

11
2285 / 1601 / 400
Регистрация: 26.06.2017
Сообщений: 4,744
Записей в блоге: 1
10.05.2019, 14:29  [ТС]
Либо никто не знает, либо знатоки ещё отдыхают!
0
 Аватар для Step_UA
1591 / 664 / 225
Регистрация: 09.06.2011
Сообщений: 1,334
10.05.2019, 22:11
Цитата Сообщение от Uswer Посмотреть сообщение
Либо никто не знает, либо знатоки ещё отдыхают!
либо в коде нет самого добавления и описания по каким же параметрам производится проверка на существование и т.п., а вытаскивать инфу из тс никому не нужно ...
1
Модератор
Эксперт .NET
 Аватар для Yury Komar
4358 / 3428 / 512
Регистрация: 27.01.2014
Сообщений: 6,258
10.05.2019, 22:30
Uswer, Почитайте про разницу ByRef и ByVal...
0
2285 / 1601 / 400
Регистрация: 26.06.2017
Сообщений: 4,744
Записей в блоге: 1
11.05.2019, 10:11  [ТС]
Цитата Сообщение от Yury Komar Посмотреть сообщение
Почитайте про разницу ByRef и ByVal...
Читал, и разницу понимаю, но как это даёт ответ на мой вопрос?

Цитата Сообщение от Step_UA Посмотреть сообщение
либо в коде нет самого добавления
Так его и нет, посему и вопрос возник. В цикле нет операторов изменения узлов, только считывание их параметров.
0
1731 / 1603 / 166
Регистрация: 25.07.2015
Сообщений: 2,683
11.05.2019, 10:18
Цитата Сообщение от Uswer Посмотреть сообщение
либо знатоки ещё отдыхают!
Либо кто-то ещё не отошёл от отдыха
Цитата Сообщение от Uswer Посмотреть сообщение
В цикле нет операторов изменения узлов, только считывание их параметров.
Вы ставите всех в тупик
Может есть смысл добавить необходимые операторы ?
Или вы знаете какой-то другой способ добавления/изменения данных ?
1
2285 / 1601 / 400
Регистрация: 26.06.2017
Сообщений: 4,744
Записей в блоге: 1
11.05.2019, 21:57  [ТС]
Чтобы не было недопонимания привожу полный код:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Private Function GetBusyNumbers(ByVal cNode As TreeNode) As Byte
        Dim inBt As Byte
        Dim NodesCollection As TreeNodeCollection 'Коллекция узлов для обработки
 
        If cNode.Parent Is Nothing Then
            NodesCollection = cNode.TreeView.Nodes
        Else
            NodesCollection = cNode.Parent.Nodes
        End If
 
        For Each nod As TreeNode In NodesCollection
            If nod.Text = cNode.Text Then
                inBt = CByte(nod.Level)
            End If
        Next
 
        Return inBt
End Function
Если что, глубина уровней не превышает размерность byte.

Добавлено через 40 минут
До входа в функцию GetBusyNumbers узел cNode уже добавлен в TreeView (отрисован и всё такое).
Сразу после выхода из функции GetBusyNumbers в TreeView появляется узел-клон последнего добавленного, т.е. это происходит при обращение к коллекции узлов.
0
1548 / 1521 / 325
Регистрация: 03.10.2012
Сообщений: 1,551
11.05.2019, 22:37
Цитата Сообщение от Uswer Посмотреть сообщение
Сразу после выхода из функции GetBusyNumbers в TreeView появляется узел-клон последнего добавленного
Он там что, святым духом что-ли появляется? Покажите весь код. Гадать на кофейной гуще здесь вряд ли кто-то умеет.
0
2285 / 1601 / 400
Регистрация: 26.06.2017
Сообщений: 4,744
Записей в блоге: 1
12.05.2019, 10:26  [ТС]
Вместо кофейной гущи попробуйте такой код.
На форму должны быть добавлены TreeView1 и Button1.
Выделяем любой узел, жмём Button1, наблюдаем автодобавление дочернего узла.
Кликните здесь для просмотра всего текста
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
Public Class Form1
    Dim btL As Byte
 
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim i As Integer
        Dim newNod, parNod As TreeNode
        newNod = New TreeNode
        newNod.Text = "First"
        Me.TreeView1.Nodes.Add(newNod)
        For i = 0 To 3
            parNod = newNod
            newNod = New TreeNode
            newNod.Text = "Node " & i.ToString
            parNod.Nodes.Add(newNod)
        Next
    End Sub
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        If (Me.TreeView1.SelectedNode IsNot Nothing) Then
            If (Me.TreeView1.SelectedNode.Nodes.Count > 0) Then
                btL = GetBusyNumbers(Me.TreeView1.SelectedNode.Nodes(0))
            End If
        ElseIf Me.TreeView1.Nodes.Count > 0 Then
            btL = GetBusyNumbers(Me.TreeView1.Nodes(0))
        End If
    End Sub
 
    Private Function GetBusyNumbers(ByRef cNode As TreeNode) As Byte
        Dim inBt As Byte
        Dim NodesCollection As TreeNodeCollection 'Коллекция узлов для обработки
 
        If cNode.Parent Is Nothing Then
            NodesCollection = cNode.TreeView.Nodes
        Else
            NodesCollection = cNode.Parent.Nodes
        End If
 
        Return inBt
    End Function
 
End Class
0
4709 / 3662 / 857
Регистрация: 02.02.2013
Сообщений: 3,518
Записей в блоге: 2
12.05.2019, 13:54
Цитата Сообщение от Uswer Посмотреть сообщение
Выделяем любой узел, жмём Button1, наблюдаем автодобавление дочернего узла.
От этого эффекта легко избавиться.
VB.NET
1
2
3
4
5
6
7
8
9
10
11
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    Dim nd As TreeNode
    If (Me.TreeView1.SelectedNode IsNot Nothing) Then
        If (Me.TreeView1.SelectedNode.Nodes.Count > 0) Then
            nd = TreeView1.SelectedNode.Nodes(0)
            btL = GetBusyNumbers(nd)
        End If
    ElseIf Me.TreeView1.Nodes.Count > 0 Then
        btL = GetBusyNumbers(Me.TreeView1.Nodes(0))
    End If
End Sub
1
2285 / 1601 / 400
Регистрация: 26.06.2017
Сообщений: 4,744
Записей в блоге: 1
12.05.2019, 16:31  [ТС]
ovva, спасибо, но как избавиться я сам понял, для этого в функцию надо передать не ссылку, а значение через ByVal. Я понять не могу почему так происходит.
0
4709 / 3662 / 857
Регистрация: 02.02.2013
Сообщений: 3,518
Записей в блоге: 2
13.05.2019, 13:46
Цитата Сообщение от Uswer Посмотреть сообщение
почему так происходит
Думаю, что это проблемы производителя, а нам остается только принять к сведению.
Предложенный пример можно заметно сократить с тем же эффектом.
VB.NET
1
2
3
4
5
6
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    Dim ii As Byte = GetBusyNumbers(TreeView1.SelectedNode.Nodes(0))
End Sub
Private Function GetBusyNumbers(ByRef cNode As TreeNode) As Byte
    Return 11
End Function
Замечу, что появляющиеся клоны узла параметра функции не являются полноценными объектами и если в Button1_Click установить счетчик узлов TreeView1.GetNodeCount(True), то он всегда будет показывать одно и то же значение, т.е. узлов не прибавляется. Кроме того при обращении к узлу источнику это обращение будет транслироваться и ко всем клонам. Например
VB.NET
1
TreeView1.SelectedNode.Nodes(0).BackColor = Color.Red
окрасит красным и узел источник и все клоны.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.05.2019, 13:46
Помогаю со студенческими работами здесь

Добавление узлов treeview
на форме лежит treeview, spinEdit и баттон. В SpinEdit вводится уровень вложенности дерева. Помогите написать процедуру создания...

Добавление узлов в TreeView
Всем привет. На форме есть компоненты: TreeView, TextBox, Button. При нажатию на кнопку мы добавляем корневой нод. При двойном нажатии...

TreeView и отображение узлов
Здравствуйте, подскажите пожалуйста, как при распахивании узла TreeView отображать его содержимое в выделенной области. Заранее спасибо

Добавление узлов в TreeView
Долго и честно бьюсь - не доходит! Почему так работает: Set objNode = .Add(, , 'Продукты', 'Продукты') Set objNode = .Add(, ,...

Название узлов в treeview
В общем..последний символ в названии корневого узла не отображается, либо не полностью отображается. Хз почему.. :cry: среда - vs 2015...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это дополнительная запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru