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

Вопрос по TreeView

13.04.2011, 13:38. Показов 1872. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
ъДТБЧУФЧХКФЕ!

фБЛПК ОЕНОПЗП МБНЕТУЛЙК ЧПРТПУЙЛ:

уХЭЕУФЧХЕФ ФБВМЙГБ вд ФЙРБ | id | parent_id | text |
ъБРПМОСА TreeView УМЕДХАЭЙН ПВТБЪПН:
Code
1
Set nodOne = tvMain.Nodes.Add(ND_MakeKey(intParentID), tvwChild, ND_MakeKey(intCurrentID), strText)
рТПВМЕНБ: РТЙ ДПВБЧМЕОЙЙ ЮБКМДБ Х ЛПФПТПЗП ЕЭЕ ОЕФ ТПДЙФЕМС (НПЦЕФ ДП ОЕЗП РТПУФП ОЕ ДПЫМБ ПЮЕТЕДШ ЙМЙ ПО ВЩМ ХДБМЕО) ЧПЪОЙЛБЕФ ПЫЙВЛБ. жХОЛГЙС ADD РЕТЧЩН РБТБНЕФТПН ПЦЙДБЕФ УУЩМЛХ ОБ РТЕДЛБ, Б ЕУМЙ ЕЗП ОЕФ - 'Element not found'.
лБЛ НПЦОП РПРТПЭЕ У ЬФЙН ТБЪПВТБФШУС ЙМЙ ФПМШЛП ТЕЛХТУЙС?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.04.2011, 13:38
Ответы с готовыми решениями:

Вопрос по TreeView 6 (MSComCtlLib)
The problem is: there is no easy way to change background colour in treeview control. Macro supplied for that cause doesnot seem to work...

Вопрос по TreeView
Можно ли вывести значок рядом с узлом, у которого нет потомков? И, соответственно, обработать клик по нему?

Вопрос по TreeView
Приветствую всех. Подскажите, пожалуйста, в следующем: есть treeview на форме, в котором отображается содержимое выбранной папки...

16
Comanche
13.04.2011, 16:06
На freevbcode.com был удачный пример.
Ищи (на сайте) на слово 'TreeView' - пример д.б. в первых 20-ти результатах поиска.
Silver
13.04.2011, 16:34
Могу посоветовать следующее.
Сначала добавить все items с ParentID,
и только потом все дочерние ветви.
Если делается запрос из базы, то
лучше двумя разными запросами.
0 / 0 / 0
Регистрация: 21.12.2010
Сообщений: 42
13.04.2011, 17:05  [ТС]
Спасибо за поддержку

2 Comanche: Смотрю freevbcode.com - там пара десятков топиков про TreeView
2 Silver: С корневыми записями как раз проблем нет - там простая проверка на parent_id=0, детей детей (в смысле внуков) заполнять не получается!
0
0 / 0 / 0
Регистрация: 08.11.2010
Сообщений: 20
14.04.2011, 19:07
Если parent_id не меняется после создания записи, то можно сортировать по parent_id. Дочерние заведомо будут ниже родителей.
Если меняется parent_id, то чтобы построить дерево одним запросом и одним проходом по рекордсету, я делал так: по тригерру на таблицу БД строим строку до корня по идентификаторам через точку. В запросе сортируем по этой строке и заполняем опять за один запрос и один проход. Если в БД нет триггеров, то строим это поле программно при добавлении / редактировании. Способ сам придумал, может такое где-то есть, может есть лучше. С удовольствием выслушаю комментарии.
0
Comanche
14.04.2011, 19:56
Не знаю, пригодится ли, но вот ссылочка:
http://www.rxkinetics.com/codebank.html

Это как раз тот проект, который когда-то лежал на freevbcode.com (почему его сейчас там нет - не знаю).

Он в исходниках. Заполняет TreeView из MDB-файла при помощи DAO.
М.б. пригодится тебе...
0 / 0 / 0
Регистрация: 21.12.2010
Сообщений: 42
17.04.2011, 11:39  [ТС]
Hello! Как выходные?

2 NashBridges: Сначала у меня так и работало (в смысле при сортировке по parent_id, но структура редактируется пользователем). Несколько запросов делать не хочется. Есть мысль прогнать несколько раз функцию заполнения treeview с отловом ошибок когда нет родителя (хотя это и топорно). В MySQL нет триггеров.

2 Comanche: Посмотрел CodeBank - забавная програмка. Заполнение идет из базы довольно просто - там только два уровня в их иерархии, поэтому как у меня проблем нет. Интересно, что заполняется не весь treeview за один проход, а только родительский уровень, а дети подгружаются по мере выбора конкретного родителя. Тоже способ - запрос всего один, дальше выбор по фильтру. Наводит на мысли...
0
Silver
17.04.2011, 12:07
Я делаю так (не совсем конечно, но идея такая)

1. Запрос. Заполняем только parent_id = 0
select distinct id,name
from table
where parent_id = 0

2. Запрос. Заполняем только дочерние ветви.
select distinct id,name
from table
where parent_id in
(select distinct id,name
from table
where parent_id = 0)

3. Запрос. Заполняем 'внучкины' ветви.
select distinct id,name
from table
where parent_id in
(select distinct id,name
from table
where parent_id in
(select distinct id,name
from table
where parent_id = 0)
)
0 / 0 / 0
Регистрация: 21.12.2010
Сообщений: 42
17.04.2011, 12:15  [ТС]
2 Silver:
Это бы сработало, но MySQL (который у нас стоит) не знает вложенных SELECT'ов :-( Хотя в новой версии, говорят, уже есть. А если уровень вложенности > 10 (откровенно говоря, он вообще неизвестен, теоретически, до упора), или програмно эти запросы лепить пока они не перестанут данные возвращать?
0
pl
51 / 17 / 6
Регистрация: 18.05.2007
Сообщений: 1,322
17.04.2011, 12:34
Делай рекурсию, передавай ParentId в качестве параметра и на каждом проходе заполняй детей переданного родителя.
0
Comanche
17.04.2011, 14:26
2Автор:
>> Интересно, что заполняется не весь treeview за один проход, а только родительский уровень, а дети подгружаются по мере выбора конкретного родителя...

Ага, это распространённый приём - 'load on demand'. Особенно полезно, если пихаешь в TreeView дерево папок/файлов к.-нибудь диска.
Silver
17.04.2011, 15:12
А если уровень вложенности > 10 (откровенно говоря, он вообще неизвестен, теоретически, до упора), или програмно эти запросы лепить пока они не перестанут данные возвращать?
------------------------------------------------------

Тогда другой вариант.
Делать один запрос, игнорировать ошибки, возникающие
при добавлении новых элементов повторные и не имеющие родителя,
и делать количество 'проходов' добавления элементов равным
количеству уровней.
0 / 0 / 0
Регистрация: 21.12.2010
Сообщений: 42
17.04.2011, 15:21  [ТС]
2 Silver - так пойдет, только как узнать сколько делать проходов (сколько уровней)? Можно действовать наверняка: по количеству записей в таблице (это максимально возможный уровень вложенности, если они все 'в цепочку')
0
0 / 0 / 0
Регистрация: 21.12.2010
Сообщений: 42
17.04.2011, 15:29  [ТС]
В общем мне нравятся два варианта:
- Один запрос, рекурсия с фильтрацией по parent_id
- 'В лоб' - один запрос, несколько последовательных проходов с обработкой ошибок

Первый вариант 'правильней', но сложнее
Второй - быстрее

Попробую первый, если что-то не покатит буду еще думать
0
0 / 0 / 0
Регистрация: 21.12.2010
Сообщений: 42
17.04.2011, 15:31  [ТС]
В смысле, попробую второй вариант, который попроще
я ж ленивый
0
Silver
17.04.2011, 17:12
Относительно второго варианта
для окончательной обработки всех записей нужно
после каждого прохода сравнивать количество записей
с количеством элементов в TreeView.
Но этого недостаточно. Нужно еще запоминать количество
элементов в TreeView за предыдущий запрос и сравнивать
его с текущим. Если это значение не изменилось и
не равно количеству записей, то процесс необходимо покинуть
иначе зациклимся. Это на случай, когда попала запись
имеющая некоректное значение parent_id.
0 / 0 / 0
Регистрация: 21.12.2010
Сообщений: 42
17.04.2011, 17:39  [ТС]
У меня там бяка была такая:
откуда-то (изза ошибок в коде, вестимо) появились записи с parent_id = id, но я их по этому условию и повылавливал.
А так вроде нормально. Забираю с сервера всю таблицу и пошел по ее записям создавать ноды (On Error Resume Next), кол-во проходов равно Recordset.RecordCount. Вроде, работает... :-)

В общем, оставлю пока так, время будет, переделаю с рекурсией и все дела.

Спасибо всем за поддержку и советы! респект...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.04.2011, 17:39
Помогаю со студенческими работами здесь

Вопрос по TreeView
Подскажите пожалуйста. Есть дерево TreeView. Мне необходимо программно считать все названия корневых узлов (без дочек) и записать их ...

Вопрос по TreeView
На форме есть TreeView, которое заполняется путем запросов из соответствующих связанных таблиц. По нажатию кнопки "Добавить" -...

Вопрос по TreeView №3
Можно ли сделать так чтобы CheckBox'ы были только у "родителей", либо только у "детей"?

Вопрос по TreeView №1
Как узнать какой из Nodes был Checked? При свойстве CheckBoxes = true!

Вопрос по TreeView №2
Можно ли сделать так, чтобы текст переносился на новую строку по достижении конца окна дерева (т.е. чтобы он не пихал весь текст в строку)?


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru