TreeView控件能夠清晰地表示層次關系在TreeView編程中常見的一個問題是同步選擇(即選擇一個節點時同時選擇該節點的所有子節點不選一個節點同時去除該節點的祖先節點選擇標志)
要實現這種效果本來不難只需要在檢測到節點選擇狀態變化時遍歷節點的祖先或者後代節點進行同步即可但是PB並沒有提供檢測節點選擇狀態變化的事件
讓我們來看看PB中TreeView節點選擇狀態的表示當TreeView的CheckBoxes屬性為True時每個節點包含一個復選框選中復選框時StatePictureIndex屬性為未選中則為當選擇某個節點時首先觸發TreeView的Clicked事件處理完Clicked事件後再對StatePictureIndex進行設置顯然如果我們能夠將Clicked事件前後節點的StatePictureIndex屬性值進行比較我們就可以判斷節點的選擇狀態是否發生了變化按照這個思路疏理PB的事件模型發現采用Post的調用事件方法可以實現將一個事件加入控件消息序列在處理完當前事件後再對新加入的事件進行處理
至此我們得到了如下的解決方案
為TreeView控件添加一個用戶事件ue_synchronizechildren(long handle integer state)
代碼如下
long childitem
treeviewitem tvitem
getitem(handle tvitem)
tvitemstatepictureindex=state
setitem(handle tvitem)
childitem=thisfinditem(ChildTreeItem! handle)
do while(childitem<>)
thisEvent ue_synchronizechildren(childitem state) //遞歸遍歷後代結點
childitem=thisfinditem(NextTreeItem! childitem)
loop
添加一個用戶事件ue_synchronizeparent(long handle integer state)如下
long parentitem
treeviewitem tvitem
getitem(handle tvitem)
tvitemstatepictureindex=state
setitem(handle tvitem)
parentitem=thisfinditem(ParentTreeItem! handle)
if parentitem<> then
thisEvent ue_synchronizeparent(parentitem state)
end if
添加一個用戶事件ue_statechanged(long handle integer prevstate)檢測節點的選擇狀態 如果發生了變化則調用ue_synchronizechildren同步後代節點並根據需要通過ue_synchronizeparent同步祖先節點
代碼如下
treeviewitem tvitem
getitem(handle tvitem)
if tvitemstatepictureindex=prevstate then
return
else
thisEvent ue_synchronizechildren(handle tvitemstatepictureindex)
if tvitemstatepictureindex= then //如需實現文末提及的功能可在此處添加代碼
thisEvent ue_synchronizeparent(handle tvitemstatepictureindex)
end if
end if
在Clicked事件中添加如下調用
treeviewitem tvitem
getitem(handle tvitem)
post event ue_statechanged(handle tvitemstatepictureindex)
為了簡單起見上面的代碼並沒有考慮當選上一個結點時它的所有兄弟已被選擇因此父結點也應該被選擇的情況如有需要請讀者自己完成
From:http://tw.wingwit.com/Article/program/PB/201311/24640.html