|
0 / 0 / 0
Регистрация: 21.12.2010
Сообщений: 42
|
||||||
Вопрос по TreeView13.04.2011, 13:38. Показов 1872. Ответов 16
Метки нет (Все метки)
ъДТБЧУФЧХКФЕ!
фБЛПК ОЕНОПЗП МБНЕТУЛЙК ЧПРТПУЙЛ: уХЭЕУФЧХЕФ ФБВМЙГБ вд ФЙРБ | id | parent_id | text | ъБРПМОСА TreeView УМЕДХАЭЙН ПВТБЪПН:
лБЛ НПЦОП РПРТПЭЕ У ЬФЙН ТБЪПВТБФШУС ЙМЙ ФПМШЛП ТЕЛХТУЙС?
0
|
||||||
| 13.04.2011, 13:38 | |
|
Ответы с готовыми решениями:
16
Вопрос по TreeView 6 (MSComCtlLib) Вопрос по TreeView Вопрос по TreeView |
|
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
|
|
|
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
|
|
| 17.04.2011, 17:39 | |
|
Помогаю со студенческими работами здесь
17
Вопрос по TreeView Вопрос по TreeView Вопрос по TreeView №3
Вопрос по TreeView №2 Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Модульная разработка через 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. . . .
|