Как отображать знак расширения TreeView [+], только если существуют дети - PullRequest
1 голос
/ 29 мая 2009

Я разработал приложение, которое заполняет древовидное представление из иерархических данных в базе данных.

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

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

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

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

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

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

Ответы [ 3 ]

5 голосов
/ 29 мая 2009

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

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

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

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

1 голос
/ 29 мая 2009

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

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

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

1 голос
/ 29 мая 2009

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

...