![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Поиск в динамически создаваемом TreeView
alexeis © (2008-12-02 16:16:00)Здравствуйте.
Имеется TreeView, которое заполняется динамически из БД. Вопрос: как организовать в нем поиск необходимых данных? Понятно, что это сводится к поиску по БД, но не ясно как это отразить в TreeView...
PS
Ноды добавляются динамически, по событию OnExpanding. Загонял бы всю базу в тривью сразу - не было бы проблемы поиск сделать.
Кто уже сталкивался с подобным?
alexeis (2008-12-04 09:13:00) [1]
> Например, в JVCL
А какую версию под D6, D7 можно потянуть?
Amoeba (2008-12-03 15:05:00) [2]
> > И вообще - к чему весь этот велосипед, если на то существует
> > готовый TDBTreeView ?
>
> А с этого места подробней пожалуйста)
> Это готовый компонент? Если да, где его можно взять?
>
Например, в JVCL. Он там даже поддерживает прямое редактирование структуры дерева прямо в нем самом.
Сергей М. (2008-12-03 13:52:00) [3]http://www.google.ru/search?q=TDBTreeView&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ru:official&client=firefox-a
alexeis (2008-12-03 13:48:00) [4]
> Если я правильно понял
> У него дерево наполнено только верхним уровнем(родителями),
> а искать нужно детей на любом уровне и при нахождении открыть
> всю ветку.
Совершенно верно
> И вообще - к чему весь этот велосипед, если на то существует
> готовый TDBTreeView ?
А с этого места подробней пожалуйста)
Это готовый компонент? Если да, где его можно взять?
Сергей М. (2008-12-03 13:33:00) [5]И вообще - к чему весь этот велосипед, если на то существует готовый TDBTreeView ?
Сергей М. (2008-12-03 13:31:00) [6]
> stas © (03.12.08 13:30) [13]
О причем здесь тогда OnExpanding ?
clickmaker (2008-12-03 13:31:00) [7]так а чем [3] не подходит? там же все предельно тупо
stas (2008-12-03 13:30:00) [8]Сергей М. © (03.12.08 13:22) [12]
Если я правильно понял
У него дерево наполнено только верхним уровнем(родителями), а искать нужно детей на любом уровне и при нахождении открыть всю ветку.
Сергей М. (2008-12-03 13:22:00) [9]
> как организовать в нем поиск необходимых данных? Понятно,
> что это сводится к поиску по БД
Мне вот пока не понятно, зачем лезть в БД, если поиск осуществляется среди ужедобавленных в TreeView узлов ?
Как все это связано с кликами юзера на узлах дерева, при которых происходит подгрузка ?
alexeis (2008-12-03 13:10:00) [10]
> должна, судя по задаче, возвращать ID и NAME узлов, чей
> ParentID равен ID узла, вызвавшего событие OnExpanding
Да. Когда кликаем на узле, оно так и делает и на OnExpanding у меня конечно другая хп, которая действительно возвращает
> возвращать ID и NAME узлов, чей ParentID равен ID узла,
> вызвавшего событие OnExpanding
Но в данном топике меня интересует именно поиск необходимых наименований, с отображением результатов поиска в treeview. Поиск то мы задаем по необходимому критерию.
Сергей М. (2008-12-03 13:02:00) [11]
> Она возвращает необходимые наименования узлов, заданных
> в критериии поиска
А должна, судя по задаче, возвращать ID и NAME узлов, чей ParentID равен ID узла, вызвавшего событие OnExpanding
alexeis (2008-12-03 12:58:00) [12]
> Т.е. эта ХП возвращает НД всего дерева, вместо того чтобы
> возвращать только данные о детях интересующего родителя
> ?
Она возвращает необходимые наименования узлов, заданных в критериии поиска. Например поиск я задал таким образом '%Це%'.
Вот оно вернуло
id | parent_id | name
172 |167 |Цех№1
172 |170 |Цех№1
180 |167 |Цех№2
180 |169 |Цех№2
Причем я вернул не только id искомой записи, а еще и id их родителей, вплоть до корня. Теперь полный путь от искомых узлов к их родителям будет таким:
172-170-167
180-169-167
Конечно, нужно еще добавить информацию о родителях родителя вплоть до корневого узла. Например, чтобы возвращаемый НД был таким:
id | parent_id | name
172 |167 |Цех№1
172 |170 |Цех№1
180 |167 |Цех№2
180 |169 |Цех№2
170 |167 |Производство№1
169 |167 |Производство№2
167 |nil |Предприятие
По большому счету, это не трудно сделать.
Как потом найти полный путь, и тем более как этот путь потом отобразить в treeview, если, повторюсь, он заполняется динамически-вот для меня проблема(
Сергей М. (2008-12-03 11:38:00) [13]
> У меня упрощенно хранимая процедура возвращает следующий
> НД
Т.е. эта ХП возвращает НД всегодерева, вместо того чтобы возвращать только данные о детях интересующего родителя ?
alexeis (2008-12-03 09:27:00) [14]
> У тебя должен запрос возвращать 2 колонки 1-я ID родителя
> 2-я ID ребенка, причем на каждого родителя всех пра-пра-
> ...-внуков )))
Есессно))
У меня упрощенно хранимая процедура возвращает следующий НД:
id | parent_id | name
172 |167 |Цех№1
172 |170 |Цех№1
180 |167 |Цех№2
180 |169 |Цех№2
Эта хранимая процедура представляет такую структуру:
-Предприятие (167)
--Производство №1(170)
--цех№1(172)
--Производство №2(169)
--цех№2(180)
как мне в этом случае строить дерево? Не могу разобраться(
По большому счету, из хп могу вытянуть любой НД, может представленного выше не достаточно?
stas (2008-12-02 16:51:00) [15]У тебя должен запрос возвращать 2 колонки 1-я ID родителя 2-я ID ребенка, причем на каждого родителя всех пра-пра-...-внуков )))
alexeis (2008-12-02 16:48:00) [16]Но попробую)
alexeis (2008-12-02 16:48:00) [17]
> ID родителя, значит, тоже есть?
> ну тогда поиск сводится к:
> - определяем ID искомой записи
> - определяем цепочку от этого ID до корня
> - раскрываем цепочку в тривью, если она еще не раскрыта
> - выделяем нод с найденным ID
Получается, нужно идти от обратного... Неудобно((
clickmaker (2008-12-02 16:31:00) [18]ID родителя, значит, тоже есть?
ну тогда поиск сводится к:
- определяем ID искомой записи
- определяем цепочку от этого ID до корня
- раскрываем цепочку в тривью, если она еще не раскрыта
- выделяем нод с найденным ID
alexeis (2008-12-02 16:28:00) [19]Конечно.
Ноды добавляются следующим образом:
NewNode := TreeView.Items.AddChildObject(Node,Trim(R^.name),R);
Туда не только ПК, а и еще много другой информации
clickmaker (2008-12-02 16:24:00) [20]первичный ключ есть в БД? В нодах он сохраняется?