![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TreeView и база данных
ChainikDenis © (2012-04-17 11:26:00)Затупил по полной, прошу помощи.
Есть база данных. В ней таблица номенклатуры. Одно из полей показывает в какую группу входит номенклатура.
Есть таблица групп. Из трех полей - идентификатор, наименование и идентификатор родительской группы. Т.е. группа может быть подгруппой. Если идентификатор родительской группы равен 0, то значит это группа верхнего уровня.
Делаю запрос к базе, получаю таблицу групп. И пытаюсь построить дерево. В качестве примера пытаюсь использовать http://decoding.narod.ru/practic/treeview/treeview.html
Верхние группы разместил без проблем, но вот дочерние никак не придумаю. Ведь искать дочернюю группу, что бы добавить ее к родительской, нужно по полю в котором индекс родительской, а в TreeView эта информация не хранится. Там только наименование группы. Но группы могут иметь одинаковое название, что конечно абсурд. Где бы мне в TreeView сохранить не только название группы, но и ее ID в базе, что бы легко было по базе шарится используя этот ID.
Эта же проблема потом вылезет при разворачивания списка номенклатуры, которая в эту группу вылезет.
Думаю что велосипед изобретаю, но все-таки помогите плиз.
Ega23 (2012-04-18 11:06:00) [1]
> не желаешь?
Статейку написать?
Так писали же, с Alkid-ом. Уже с Зотовым о рецензировании договорились. А потом - забили болт, показалось мышиной вознёй какой-то. Интерес пропал.
> да, пора Королеве переписать статейку :)
Да, от неё не ожидал.
AV (2012-04-18 10:59:00) [2]да, пора Королеве переписать статейку :)
> Ega23 © (17.04.12 22:19) [8]
не желаешь?
Включив VirtualTreeView, например, с
> [+] должен быть отрисован только в тех узлах, которые мы
> действительно можем раскрыть. Если у нас лист дерева, то
> никакого плюса быть не должно.
Ega23 (2012-04-17 22:19:00) [3]
> Влад (17.04.12 19:26) [7]
>
> http://www.delphisources.ru/pages/faq/base/dbtreeview.html
Гораздо правильнее строить отдельные ветки дерева динамически, только в тот момент, когда они наверняка понадобятся.
Это очень, очень и очень спорное утверждение.
For i:=1 To qTreeCompanies.RecordCount Do
За такое надо отстреливать голову, труп сжечь, прах закопать на линии прибоя, чтобы ни Земле, ни Морю не досталось.
// Добавим фиктивную (пустую) дочернюю ветвь только для того,
// чтобы был отрисован [+] на ветке и ее можно было бы раскрыть
Вот только есть проблема: [+] должен быть отрисован только в тех узлах, которые мы действительно можем раскрыть. Если у нас лист дерева, то никакого плюса быть не должно.
if Node.getFirstChild.Data = nil then
А вот фиг. Integer(nil) = 0. А где гарантия, что я не поставлю для корневого узла ID =0, ParentID = null? Кстати, ЕМНИП, далеко не все СУБД позволят вторичный ключ на ParentID наложить, если в корневом узле не null (что, в общем-то правильно).
qTreeAnalytic.Sql.Clear;
qTreeAnalytic.Sql.Add(Sql);
Бр-р-р-р-р...
Влад (2012-04-17 19:26:00) [4]http://www.delphisources.ru/pages/faq/base/dbtreeview.html
Ega23 (2012-04-17 17:04:00) [5]
> Спасибо. Разобрался. Правда повозится с указателями пришлось малость ...
Node.Data := Pointer(ID);
ID := Integer(Node.Data);
sniknik (2012-04-17 17:00:00) [6]> Правда повозится с указателями пришлось малость ...
зачем? у тебя же id интеджер, или нет?
ChainikDenis (2012-04-17 15:51:00) [7]Спасибо. Разобрался. Правда повозится с указателями пришлось малость ...
Ega23 (2012-04-17 12:55:00) [8]1. Можно взять готовый компонент, они есть (в DevExpress вроде что-то было).
2. Можно написать самому.
2.1. Можно написать полноценный TDBTreeView, но нужно будет детально разбираться с TDataSet, TDataSource и TDataLink. Универсализма не достичь, ибо для построения дерева нужен DataSet который фетчит записи до конца.
2.2. Для решения конкретной задачи можно задействовать стнадартный TTreeView с его TTreeNode.Data. Но лично я бы предпочёл взять TVirtualStringTree от SoftJems.
sniknik (2012-04-17 11:35:00) [9]> а в TreeView эта информация не хранится.
кто мешает ее там хранить? у нодов есть data под данные, любые в принципе.
stas (2012-04-17 11:34:00) [10]NODE.DATA - сюда можно писать что угодно...