2009-05-29 4 views
1

Я разработал приложение, которое заполняет древовидное изображение из иерархических данных в базе данных.Как только показать знак расширения TreeView [+], если существуют дети

Я разработал его для использования ленивой загрузки, поэтому он получает дочерние узлы только при расширении узла.

Моя проблема в том, что, очевидно, я не знаю, есть ли у узла дети, если я не позвоню в базу данных и не посмотрю. В настоящее время я реализовал фиктивный дочерний узел, так что значок [+] появляется для всех узлов, затем я удаляю этот фиктивный узел и получаю реальные дочерние узлы в событии BeforeExpand.

Это означает, что я получаю значок [+] для узлов, у которых нет дочерних узлов, поэтому пользователь нажимает значок развернуть, и ничего не показывают, что выглядит немного дрянным.

Что такое метод preffrred для обработки дочерних узлов в древовидной структуре с ленивой загрузкой? Если я позвоню в базу данных, чтобы узнать, есть ли дочерние узлы, я мог бы просто загрузить дочерние узлы и забыть о ленивой загрузке?

Одна мысль, что я должен был хранить флаг «HasChildren» в базе данных, поэтому я могу выборочно создавать свой фиктивный дочерний узел только для узлов, которые на самом деле do имеют дочерние узлы.

Извините за бессвязными, мне очень интересно посмотреть, что другие люди думают ...

+0

BTW: это Treeview в Visual Studio 2005 –

ответ

4

Когда вы делаете вызов, проверьте для детей вместе с данными узла:

SELECT tp.*, 
     (
     SELECT 1 
     FROM table tc 
     WHERE tc.parent = tp.id 
     LIMIT 1 
     ) AS has_children 
FROM table tp 

Вы не должны рассчитывать, это может быть долго.

Просто проверьте, существует ли хотя бы один ребенок.

+0

Chapeau для этого очень простого и простого скрипта! Если вам нужно отфильтровать не-дочерние элементы, добавьте 'HAVING has_children = 1' в конце – Mateng

1

изменить ваш первоначальный запрос, чтобы вернуть все те же данные, но и подсчет детей. когда число детей не равно нулю, отобразите [+]. опубликовать схему и запрос для получения необходимых сведений графа

1

Мое предпочтительное решение этой проблемы - реализовать предварительно упорядоченный обход дерева на вашем наборе иерархических данных. См. http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ для примера реализации.

Дело в том, что если вы сохраняете левое и правое значение для каждого узла, то если значение слева и справа отличается более чем на один, у этого узла есть дети.

Единственным заметным недостатком этого подхода является то, что вы должны активно поддерживать эти левые и правые значения при изменении структуры узлов.

Смежные вопросы