|
Вопрос по TreeView
|
|||
---|---|---|---|
#18+
Доброе время суток. Вопрос по поиску в дереве: нужно для конкретного родителя сделать "пробежку" по всем детям, не трогая внуков, правнуков и т.д. Мой вариант: LOCAL _cnt, i, _Node, _Child, _str _Node = ThisForm.TreeKladr.Nodes(_SEARCH).Parent && ссылка на родителя, (находится правильно) _cnt = _Node.Children && количество детей, (в тестовом варианте дает 180 детей) _Child = _Node.Child && первый ребенок (ссылку дает на "правильного" ребенка, первого в списке _str = "КА" && строка для поиска FOR i = 1 TO _cnt IF _str = UPPER(ALLTRIM(_Child.Text)) =MESSAGEBOX('Found - '+_Child.Text) EXIT ENDIF _Child = _Node.Next && вот тут возникает ошибка: _Node.Next равен .NULL. ENDFOR Может я не допонял свойство Next? Мне бы хотелось чтобы это свойство давало следующего ребенка. Или у меня подозрение в том что цикл FOR...ENDFOR тут неуместен: нужно искать детей у конкретного родителя через DO WHILE...ENDDO, то есть "шариться" по всему дереву и искать тех детей, у кого "конкретный" родитель ... |
|||
:
Нравится:
Не нравится:
|
|||
25.04.2011, 03:22 |
|
Вопрос по TreeView
|
|||
---|---|---|---|
#18+
Проще хранить данные в таблице/курсоре и там с ними работать. А дерево использовать только для отображения данных. Так обработка будет значительно быстрее и дерево при открытии можно будет не наполнять целиком, а подгружать нужные ветки при их открытии. PS Имена переменных начинать с подчеркивания не советую, т.к. в фоксе есть набор служебных переменных и все они начинаются с подчеркивания. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.04.2011, 06:32 |
|
Вопрос по TreeView
|
|||
---|---|---|---|
#18+
Dima T, можно попробовать так: * Создаем временный курсор для хранения все вершин дерева * естественно, типы и размерность полей - какие вам нужны CREATE CURSOR FullTree (NodeKey C(10), ParentNodeKey C(10), NodeText CHAR(50)) * заполняем этот курсор (если надо, применяем ALLTRIM, UPPER, LOWER и т.п.) FOR i = 1 TO ThisForm.TreeKladr.Nodes.Count INSERT INTO FullTree VALUES(ThisForm.TreeKladr.Nodes(i).Key, ; ThisForm.TreeKladr.Nodes(i).Parent.Key, ThisForm.TreeKladr.Nodes(i).Text) ENDFOR * Выбираем из полученного курсора все вершины, * с заданным родителем и свойством .TEXT равным искомой строке SELECT * FROM FullTree ; WHERE FullTree.ParentNodeKey = _Node AND ; UPPER(ALLTRIM(_Child.Text)) = _str INTO CURSOR OnlyFoundChildren ... |
|||
:
Нравится:
Не нравится:
|
|||
28.04.2011, 10:58 |
|
Вопрос по TreeView
|
|||
---|---|---|---|
#18+
Marina N.Dima T, можно попробовать так: * Создаем временный курсор для хранения все вершин дерева * естественно, типы и размерность полей - какие вам нужны CREATE CURSOR FullTree (NodeKey C(10), ParentNodeKey C(10), NodeText CHAR(50)) * заполняем этот курсор (если надо, применяем ALLTRIM, UPPER, LOWER и т.п.) FOR i = 1 TO ThisForm.TreeKladr.Nodes.Count INSERT INTO FullTree VALUES(ThisForm.TreeKladr.Nodes(i).Key, ; ThisForm.TreeKladr.Nodes(i).Parent.Key, ThisForm.TreeKladr.Nodes(i).Text) ENDFOR ... Можно по всякому попробовать, например проделать это с деревом в 5-10 тысяч узлов и потом объяснять юзеру что тормоза из-за того что справочник у него сильно большой. Кроме того дерево должно быть предварительно заполнено целиком, что еще медленнее будет чем этот код. Чтобы тормозов не было - дерево должно только отображать данные. Самый быстрый способ такой: при старте показывается только узлы первого уровня, при попытке пользователем открыть узел - добавляются только его дочерние узлы. Крайне редко пользователю надо видеть все дерево в развернутом виде, а при таком подходе получается что реально в дереве 100-200 узлов. И не надо назначать дерево "передастом", т.е. сначала писать туда а потом читать из него, гораздо быстрее прочитать напрямую из базы. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.04.2011, 12:01 |
|
Вопрос по TreeView
|
|||
---|---|---|---|
#18+
Dima T, Э-э... ошибочка вышла. Мой первый ответ предназначался не Вам, а Даниэлю. Sorry! А Ваши замечания, конечно, верны. Но только, вопрос, - по какой-то причине, известной только автору, - был именно о дереве. Бог весть, как оно создается. С чего Вы взяли, что там вообще есть для этого таблица? И почему это дерево обязательно большое? Я предлагаю вариант, а подойдет он автору темы или нет– это уж ему решать. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.04.2011, 12:26 |
|
Вопрос по TreeView
|
|||
---|---|---|---|
#18+
Marina N.С чего Вы взяли, что там вообще есть для этого таблица? Даже если ее нет, то можно создать курсор вместо изначального наполнения дерева. Marina N.И почему это дерево обязательно большое? Даниэль... _cnt = _Node.Children && количество детей, (в тестовом варианте дает 180 детей) ... Думаю немаленькое если у одного узла 180 дочерних. PS Топикстартер за 3 дня не объявился, наверно уже решил свою проблему по принципу "лишь бы работало". PPS По собственному опыту могу сказать что написанное по принципу "лишь бы работало" через некоторое время приводит к тому приходится это место переписывать с нуля и зачастую править код связанный с этим. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.04.2011, 13:31 |
|
Вопрос по TreeView
|
|||
---|---|---|---|
#18+
Не смешно. Проблемка автора вопроса заключалась в том, что цикл у него должен быть FOR i =1 TO _cnt-1 Одного "ребятенка" он уже посчитал как CHILD, стало быть обойти осталось CHILDREN - 1. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.04.2011, 15:07 |
|
|
start [/forum/topic.php?fid=41&fpage=75&tid=1584370]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
27ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
39ms |
get tp. blocked users: |
1ms |
others: | 285ms |
total: | 395ms |
0 / 0 |