2009-05-29 37 views
1

我已經開發了一個應用程序,用於從數據庫中的分層數據填充樹視圖。如果孩子存在,如何僅顯示TreeView展開標誌[+]

我將它設計爲使用延遲加載,因此它只在展開節點時獲取子節點。

我的問題是,顯然我不知道節點是否有孩子,除非我打電話給數據庫,然後看。目前我已經實現了一個虛擬子節點,因此所有節點都會出現[+]圖標,然後刪除此虛擬節點並獲取BeforeExpand事件中的真實子節點。

這意味着我得到一個沒有子節點的節點的[+]圖標,所以用戶點擊展開圖標,沒有任何顯示看起來有點低劣。

在懶加載樹視圖中處理子節點的preffrred方法是什麼?如果我調用數據庫來查看是否有子節點,那麼我可能只是加載子節點並忘記延遲加載權?

我想過的一個想法是在數據庫中存儲一個'HasChildren'標誌,所以我可以選擇性地創建我的虛擬子節點,僅用於實際上有有子節點的節點。

對不起,漫無邊際地講,我看其他人的想法很感興趣......

+0

順便說一句:這是Visual Studio 2005中的Treeview – 2009-05-29 16:02:26

回答

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 2012-01-20 09:43:51

1

改變你的初始查詢返回的所有相同的數據,也是兒童的計數。當孩子數不爲零時顯示[+]。發表您的架構和查詢,瞭解如何讓計數

1

我對此問題的首選解決方案是在您的分層數據集上實現預先定序的樹遍歷。有關示例實現,請參見http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

問題是如果你爲每個節點保留一個左值和右值,那麼如果左值和右值相差多於一個,那麼該節點就有子元素。

這種方法唯一值得注意的缺點是在更改節點結構時必須主動維護這些左值和右值。

相關問題