checkedboxes的值对应treeview的statepictureindex
statepictureindex = 1 为未选中状态,
statepictureindex = 2 为选中状态。
在clicked事件中,先触发clicked事件,再改变checkedbox状态
实现:treeview的同步选择(checkboxes)的用法
1、当选择了父节点时,所有的子节点都选择
2、当一个子节点选择时,父节点选择
3、当所有子节点都没选择市,父节点取消选择
4、计算子节点中选择数量。(最后一层节点中选择的数量)
代码:
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
2、为 treeview 添加用户事件 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
3、为 treeview 添加一个用户事件 ue_statechanged(long handle, integer prevstate)检测节点的选择状态, 如果发生了变化则调用ue_synchronizechildren同步后代节点,并根据需要通过ue_synchronizeparent同步祖先节点。代码如下:
treeviewitem tvitem
getitem(handle, tvitem)
if tvitem.statepictureindex=prevstate then return //复选框 选择状态不变,则不处理
this.Event ue_synchronizechildren(handle, tvitem.statepictureindex)
//选中一个,则父节点选中
if tvitem.statepictureindex= 2 then
this.Event ue_synchronizeparent(handle, tvitem.statepictureindex)
end if
//取消选择,则判断同级状态,若都未选中,则父节点取消选择
if tvitem.statepictureindex=1 then
long nextitem
treeviewitem ntvitem
//同层下一项
nextitem=this.finditem(nexttreeItem!, handle)
do while(nextitem<>-1)
getitem(nextitem, ntvitem)
if ntvitem.statepictureindex=2 then return
nextitem=this.finditem(NextTreeItem!, nextitem)
loop
//同层上一项
nextitem=this.finditem(previoustreeItem!, handle)
do while(nextitem<>-1)
getitem(nextitem, ntvitem)
if ntvitem.statepictureindex=2 then return
nextitem=this.finditem(previoustreeItem!,nextitem)
loop
this.Event ue_synchronizeparent(handle, tvitem.statepictureindex)
end if
4、为 treeview 添加一个用户事件 ue_state(long handle, integer prevstate)用于记录已选择节点个数。代码如下:
event ue_statechanged(al_handle, ai_state)
//计数
int li_i
int li_count = 0 //数量
int li_root,li_temp,li_temp2
treeviewitem ltv_temp,ltv_temp2
li_root = tv_1.finditem(roottreeitem!,0)
li_temp = tv_1.finditem(childtreeitem!,li_root)
do while li_temp <> -1
tv_1.getitem(li_temp,ltv_temp)
li_temp2 = tv_1.finditem(childtreeitem!,li_temp)
tv_1.getitem(li_temp2,ltv_temp2)
do until 1<>1
if ltv_temp2.statepictureindex = 2 then
li_count++
end if
li_temp2 = tv_1.finditem(nexttreeitem!,li_temp2)
if li_temp2 = -1 then exit
tv_1.getitem(li_temp2,ltv_temp2)
loop
li_temp = tv_1.finditem(nexttreeitem!,li_temp)
loop
5、在 treeview 的clicked 事件里写入
treeviewitem tvitem
getitem(handle, tvitem)
post event ue_state(handle, tvitem.statepictureindex)