treeview隱藏還原節點

 

先簡單說下需求,就是兩個treeview控件,一個左邊一個右邊,均支持移入移出功能,右邊樹的任意節點移動到左邊樹之後,再移動回來,必須跟初始位置保持一致且還原該節點及子節點移除時的狀態,注意是移除時的狀態,這個狀態會變。簡單看下效果吧,我錄製了一張gif圖片。

 

接着簡單說下我這邊的處理思路吧,其實在剛接到這個需求的時候,我還是比較淡定的,不慌,爲啥呢?因爲當時心裏有兩套方案。1.treeview節點的隱藏功能,這是最簡單的,2.如果不支持隱藏,重繪它的節點實現隱藏功能。想的挺美好啊,真的小看treeview控件了。寫起代碼來,沒一個省油的燈,第一種隱藏節點,它壓根不支持,沒這個屬性,第二種就奇葩了,爲啥奇葩呢?它有個屬性叫drawmodel,可以指定繪製所有,我的理解是treeview節點的所有信息都可以隨意繪製吧,可偏偏就是節點座標不能指定,簡單來說,它底層已經幫你計算好了每個節點在treeview裏面的座標位置,如果你改了,不但繪製顯示有問題,還會出現張冠李戴的情況,完全錯亂了,最後由於時間問題也就沒糾結了,放棄了,個人猜測應該是可以通過windows消息處理這個問題。那咋辦,工作還的做啊,其實還有一個簡單的方案,dotnetbar裏面的treeview支持節點隱藏,可惜我命苦啊,dotnetbar裏面的控件只要加載到窗體上面,我的vs馬上罷工,無響應。眼看捷徑是沒有了,終極解決辦法,上必應搜啊,一圈搜下來毫無收穫,那就硬着頭皮寫吧。

代碼就不貼了,說下思路也算是給有需要的朋友一個參考吧,上圖看到的效果其實不是隱藏,是先刪除後添加操作。刪除操作,具體邏輯是,右邊treeview移除節點時,備份該節點及該節點的父節點,爲啥要備份到它的父節點呢?一般情況下不應該就備份該節點就可以了嗎?這裏主要是完整性,也就是該節點的上下左右信息都有了,如果不備份到父節點,節點會丟失,注意不是把該節點父節點的所有子節點備份下來,其他兄弟節點只備份這一層數據,也可以直接在右邊樹初始化時,完整備份一份。還原操作,1.從備份信息裏面檢索該節點,其中會包含父節點,2.創建它的父節點(如果也被移除了),創建父節點是一個遞歸的過程,有這麼一種情況,先刪除它,再把它爺爺節點刪了,在我先還原它時,它的爺爺節點也要在原始位置被創建出來,並且它爺爺節點下面只有一個父親節點,父親節點下面就只有它。3.還原該節點,這也有兩種情況,可能它被其他還原創建了,不管它有沒有被創建,它的子節點肯定是沒有的,接着遞歸創建它的子節點(如果有)。

4.節點排序,通過移除時的備份節點排序,還原位置信息。當然真的實現起來還是有很多細節的,就到這吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章