Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» dxDbTreeView

Автор: alexnkn
Дата сообщения: 26.09.2013 14:50
Здравствуйте!
Я использую приобретенный давно компонент dxDbTreeView. Компонент мне очень нравится, но недавно столкнулся с одной проблемой при использовании бд firebird. Есть стандартная древовидная таблица (ID, Parent, Name). К таблице подключен датасет (pFIBDataSet), к которому подключен dxDbTreeView. Дерево успешно выстраивается. Проблема в том, что после добавления новых узлов, обновление дерева не корректно отображается. Некоторые новые узлы после вставки данных в древовидную таблицу сразу отображаются раскрытыми, некоторые свернутыми.. Обновление dxDbTreeView после вставки записей произвожу выключением и включением датасета. Мне нужно чтобы после добавления новых веток открывались именно только что добавленные. Не подскажете в каком направлении копать)?
Автор: Dmitry
Дата сообщения: 26.09.2013 15:36
alexnkn

Не уверен, но может делать добавленную запись текущей в датасете после его повторного открытия.
Автор: alexnkn
Дата сообщения: 26.09.2013 17:34
Вариант с текущей записью не проходит. Я уже всякие варианты пробовал..
Автор: Dmitry
Дата сообщения: 27.09.2013 08:32
Т.е. если я правильно понял, то нужно все узлы свернуть, а вновь добавленный развернуть и сделать текущим?
Тогда так:

tvTreeData.Items.BeginUpdate();
dstTreeData.Close();
dstTreeData.Open();
tvTreeData.FullCollapse();
tvTreeData.Items.EndUpdate();
dstTreeData.Locate('<Поле ID>', <Значение ID добавленного узла>, []);
Автор: alexnkn
Дата сообщения: 27.09.2013 14:28
[more] Спасибо, Dmitry. Работает. Конечно после FullCollapse дерево вздрагивает)) после вставки. Если дерево будет состоять из нескольких тысяч записей после FullCollapse оно может долго отрисовываться.
В идеале мне нужно чтобы после вставки записей выделялся только что добавленный узел, а все остальные оставались в том же состоянии какое было до вставки нового узла (раскрытые остаются раскрытыми, закрытые - закрытыми).
Если использовать только что полученное значение генератора для поля ID ('select gen_id (M.ID , 0) from rdb$database') и находить его при помощи locate, только что добавленный узел становится активным и раскрывается, но вместе с ним почему то раскрывается еще какая то часть узлов (это если без FullCollapse) . Я так и не понял по какому принципу раскрываются остальные узлы, так как каждый раз раскрывается разное количество узлов после добавления нового.
Хотелось бы сделать без FullCollapse чтобы дерево не дергалось после вставки. Но никак не могу найти причину такого поведения дерева при добавлении новых веток [/more]
Автор: Dmitry
Дата сообщения: 27.09.2013 14:37
Теоретически между Items.BeginUpdate/Items.EndUpdate дерево не должно перерисовываться (вздрагивать). Или оно вздрагивает именно после вставки? Тогда можно попытаться и вставку завернуть в BeginUpdate/EndUpdate.
Почему сразу после открытия датасета оказываются развернутыми еще часть узлов, не относящихся к текущей записи, я не знаю. Можно попытаться порыться в исходниках самого dxDBTreeView если это так важно.
Автор: alexnkn
Дата сообщения: 27.09.2013 14:40
Спасибо, буду дальше изучать компонент

Страницы: 1

Предыдущая тема: Помогите спроектировать базу данных и программу на Delphi


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.