要實現這種效果,本來不難,只需要在檢測到節點選擇狀態變化時,遍歷節點的祖先或者後代節點進行同步即可。但是PB並沒有提供檢測節點選擇狀態變化的事件。怎麼辦呢?
讓我們來看看PB中TreeView節點選擇狀態的表示。當TreeView的CheckBoxes屬性爲True時,每個節點包含一個複選框。選中複選框時,StatePictureIndex屬性爲2,未選中則爲1。當選擇某個節點時,首先觸發TreeView的Clicked事件,處理完Clicked事件後再對StatePictureIndex進行設置。顯然,如果我們能夠將Clicked事件前後節點的StatePictureIndex屬性值進行比較,我們就可以判斷節點的選擇狀態是否發生了變化。按照這個思路,疏理PB的事件模型,發現採用Post的調用事件方法,可以實現將一個事件加入控件消息序列,在處理完當前事件後再對新加入的事件進行處理。至此,我們得到了如下的解決方案:
1. 爲TreeView控件添加一個用戶事件ue_synchronizechildren(long handle, integer state),代碼如下:
long childitem
treeviewitem tvitem
getitem(handle, tvitem)
tvitem.statepictureindex=state
setitem(handle, tvitem)
childitem=this.finditem(ChildTreeItem!, handle)
do while(childitem<>-1)
this.Event ue_synchronizechildren(childitem, state) //遞歸遍歷後代結點
childitem=this.finditem(NextTreeItem!, childitem)
loop
添加一個用戶事件ue_synchronizeparent(long handle, integer state),如下:
long parentitem
treeviewitem tvitem
getitem(handle, tvitem)
tvitem.statepictureindex=state
setitem(handle, tvitem)
parentitem=this.finditem(ParentTreeItem!, handle)
if parentitem<>-1 then
this.Event ue_synchronizeparent(parentitem, state)
end if
2. 添加一個用戶事件ue_statechanged(long handle, integer prevstate)檢測節點的選擇狀態, 如果發生了變化則調用ue_synchronizechildren同步後代節點,並根據需要通過ue_synchronizeparent同步祖先節點。代碼如下:
treeviewitem tvitem
getitem(handle, tvitem)
if tvitem.statepictureindex=prevstate then
return
else
this.Event ue_synchronizechildren(handle, tvitem.statepictureindex)
if tvitem.statepictureindex=1 then //如需實現文末提及的功能,可在此處添加代碼。
this.Event ue_synchronizeparent(handle, tvitem.statepictureindex)
end if
end if
3. 在Clicked事件中,添加如下調用:
treeviewitem tvitem
getitem(handle, tvitem)
post event ue_statechanged(handle, tvitem.statepictureindex)