Стартовая страница › Форумы › Разработка и интеграция › Модули сервера V6, возможности?
- В этой теме 59 ответов, 4 участника, последнее обновление 1 год, 10 месяцев назад сделано
Mikhail.
-
АвторСообщения
-
17.04.2023 в 16:25 #28283
manjey73
УчастникВаш код EnumerateChildObjects показывает все дочерние объекты в куче по отношению к самому первому родителю.
Вот тут и бьюсь об стенку. То есть нет ветвления у меня.Даже до 3-его уровня вложенности не могу дойти. Уровней может быть разное количество.
на счет использования TreeView понятно, вот с нодами и вложенностями у меня беда…
Не получается пробираться внутрь следующих вложенных дочерних объектов для создания дерева.17.04.2023 в 16:27 #28284manjey73
УчастникВот вижу что у OPC UA при чтении сервера есть вложенности, но не уверен, что они неизвестны.
17.04.2023 в 16:29 #28285manjey73
УчастникМне нужно на основе Таблицы объектов, создать ветки в TreeView и при создании еще туда запихнуть каналы, относящиеся именно к этому объекту, предварительно отфильтровав. То есть не все подряд пихать и выбрав например шаблон(ы) по коду тега…
17.04.2023 в 16:44 #28286manjey73
УчастникСобственно пример ветвления. Суть наверное будет понятна. Уровень вложений неизвестен. Просто для понимания.
А используя EnumerateChildObjects я получаю всех дочерних одним списком. Понимаю, что там вложенный цикл еще, но вот завернуть так чтобы построилось дерево с неизвестным уровнем вложения не получается…
17.04.2023 в 22:03 #28287JurasskPark
УчастникЯ как понял, manjey73 делает проект под ЖКХ. Типо дом, квартира, датчик.
Это понятно.
Вы хотите заполнить дерево. Это тоже понятно.
Задача взять три таблицы: канал, девайс, теги.
Создать дерево из этого. Этот тоже понятно.Вы сомневаетесь в том, что нужно красивое решение, а найти его не можете. Это тоже понятно.
Ответ: как писал Михаил — рекурсия, вы ничего другого не найдете.Шаги. 1. Берете таблицу каналы и берете первую запись по ней. Добавляете в дерево.
2. Берете таблицу девайсы и идёте по всём записям. Нашли в ней ID канала — дьоавляете как дочку канала.
3. Зная ID девайсы, которое вы только добавили теперь идёте по тегам. Нашли в записи ID девайсы, добавили тег.
4. Завершили таблицу теги, вернулись к таблице девайсов.
5. Завершили таблицу девайсов, возвращаетесь к следующей записи канала.Рекурсия. По-другому никак.
17.04.2023 в 22:55 #28288manjey73
УчастникТо, что рекурсия это понятно, пытаюсь применить код, на который указал Михаил.
Идея и смысл мне понятны. При чем подход меня больше нравится именно с точки зрения объектов. Ибо там еще должен быть фильтр, в том числе и по объектам.Просто лыжи не едут, особенно в той части, что там по коду используется интерфейс ITable.
Почему с точки зрения объектов? если мне объект не нужен, я просто его игнорирую.
Если строить дерево двигаясь от каналов, то будет лишняя работа.18.04.2023 в 09:36 #28289manjey73
Участникз.ы. в Таблице каналов все необходимое есть, и девайс и объект.
Нет Родительских объектов.Ну и рекурсия всегда выполняется с головы а не наоборот. И в том случае, если уровень вложений неизвестен.
Пример с ЖКХ просто наиболее показательный. Мне нужен не только он, а вообще правильное дерево со всеми вложениями.
18.04.2023 в 12:55 #28290manjey73
УчастникНа обычных Нодах, как картинки тут прикручивать интересно ????
с кодом Михаила не разобрался как на нем заставить сделать иерархию…18.04.2023 в 13:22 #28291JurasskPark
УчастникImageList. Переносите на форму. Туда картинки вставляете.
У TreeView.ImageList указываете ваш ImageList.
У TreeNode tn указываете по номеру или названию изображения
tn.ImageKey = tn.SelectedImageKey = «название»;18.04.2023 в 14:10 #28292Mikhail
МодераторПо ID дочернего объекта всегда можно найти родительский объект, получая Obj.ParentObjNum в цикле.
18.04.2023 в 14:25 #28293manjey73
Участник@jurasskpark на форму добавил, вытащил из драйвера OPC UA, но пока не выходит чтобы отобразились. Возможно не так что-то делаю с TreeNode при связывании с TreeView.
@mikhail а зачем их искать если у канала только ID собственного объекта?19.04.2023 в 13:00 #28294Mikhail
Модератора зачем их искать если у канала только ID собственного объекта?
Наверное, я не понял, в чём заключается проблема.
19.04.2023 в 15:21 #28295manjey73
УчастникПросто для построения дерева нужно идти сверху, а знание того, что ID объекта канала имеет родителей сильно не помогает.
В смысле так дольше будет проходить поиск. Может если для каких-то специфических целей что-то найти ну можно вызывать отдельно такую функцию.
А если надо постоянно, то проще пройтись один раз и сохранить в словарь списков или массивов с записью всей иерархии.19.04.2023 в 19:51 #28296JurasskPark
УчастникА если надо постоянно, то проще пройтись один раз и сохранить в словарь списков или массивов с записью всей иерархии.
A TreeView это как раз и делает :). Он хранит всю иерархию. 🙂
20.04.2023 в 13:56 #28300Mikhail
МодераторУ каждого TreeNode есть свойство Tag, в которое можно положить нужный объект, связанный с узлом дерева. Поэтому выбрав узел, можно сразу узнать соответствующий ID объекта, например.
-
АвторСообщения
- Вы должны авторизироваться для ответа в этой теме.