常见的左边treeview右边dw的窗口界面里,左边的树绝大多数对应右边数据窗口中的某个或几个栏位,当树项中的某level的父项data也是右边数据窗口的某个栏位时, 用下边的简单方法能为指定层次实行动态刷新,数据删除时=树项删除,增加数据时=树项插入,数据修改时=树项先删再增。具体步骤如下:
1)如下图,建好一个sheet,左边添加treeview控件,右边添加dw,中间用st间开。
左边tv_1,右边dw_1
2)新建两个窗囗函数用于增加和删除树项。
//==============================================================================
// 函数: wf_deleteitem(),在指定层增加树项,最多支持四层.
//------------------------------------------------------------------------------
// 参数:
// value integer ai_level (删除层)
// value any aa_parent (父层data)
// value string aa_data (Data)
//------------------------------------------------------------------------------
// 返回值: integer
//------------------------------------------------------------------------------
// 日期: 2007-10-06
//==============================================================================
long ll_handle,ll_level1,ll_level2,ll_level3
treeviewitem l_tvi
ll_level1 = tv_1.FindItem(RootTreeItem!,0) //根
ll_level2 = tv_1.FindItem(ChildTreeItem!,ll_level1) //第一层
ll_level3 = tv_1.FindItem(ChildTreeItem!,ll_level2) //第二层
If ai_level = 1 Then //删除数据位于第二层
ll_handle = ll_level1
ElseIf ai_level = 2 Then //删除数据位于第三层
ll_handle = ll_level2
ElseIf ai_level = 3 Then //删除数据位于第四层
ll_handle = ll_level3
End If
tv_1.GetItem(ll_handle,l_tvi) //查找父层data
Do While l_tvi.Data <> aa_parent
ll_handle = tv_1.FindItem(NextTreeItem!,ll_handle)
tv_1.GetItem(ll_handle,l_tvi)
Loop
ll_handle = tv_1.FindItem(ChildTreeItem!, ll_handle)
tv_1.GetItem(ll_handle,l_tvi)
Do While l_tvi.Data <> aa_data //查找当前层data
ll_handle = tv_1.FindItem(NextTreeItem!, ll_handle)
tv_1.GetItem(ll_handle,l_tvi)
Loop
tv_1.DeleteItem(ll_handle)
Return 1
//==============================================================================
// 函数: wf_insertitem(),在指定层增加树项,最多支持四层.
//------------------------------------------------------------------------------
// 参数:
// value integer ai_level (插入层)
// value any aa_parent (父层data)
// value string as_label (Label)
// value any aa_data (Data)
// value integer ai_index (PictureIndex,SelectedPictureIndex,默认两者相等)
// value boolean ab_child (子层是否可用)
//------------------------------------------------------------------------------
// 返回值: integer
//------------------------------------------------------------------------------
// 日期: 2007-10-06
//==============================================================================
long ll_handle,ll_level1,ll_level2,ll_level3
treeviewitem l_tvi
ll_level1 = tv_1.FindItem(RootTreeItem!,0) //根
ll_level2 = tv_1.FindItem(ChildTreeItem!,ll_level1) //第一层
ll_level3 = tv_1.FindItem(ChildTreeItem!,ll_level2) //第二层
If ai_level = 1 Then //根层下(插入数据位于第二层)
ll_handle = ll_level1
ElseIf ai_level = 2 Then //第一层下(插入数据位于第三层)
ll_handle = ll_level2
ElseIf ai_level = 3 Then //第二层下(插入数据位于第四层)
ll_handle = ll_level3
End If
tv_1.GetItem(ll_handle,l_tvi) //查找父层data
Do While l_tvi.Data <> aa_parent
ll_handle = tv_1.FindItem(NextTreeItem!,ll_handle)
tv_1.GetItem(ll_handle,l_tvi)
Loop
l_tvi.Label = String(as_label)+'('+String(aa_data)+')' //默认Label形式
l_tvi.Data = aa_data
l_tvi.PictureIndex = ai_index
l_tvi.SelectedPictureIndex = ai_index
l_tvi.Children = ab_child
tv_1.InsertItemLast(ll_handle,l_tvi)
Return 1
3)在 dw_1内新建一个事件放在update()之前调用
//==============================================================================
// 事件: ue_refresh_tv(),刷新tv_1树项.
//------------------------------------------------------------------------------
// 参数:
// value integer ai_level (层次,数据层的上一层)
// value string as_parent (父层data栏位)
// value string as_data (Data栏位)
// value string as_label (Label栏位)
// value integer ai_index (PictureIndex)
// value boolean ab_child (是否包含Childen)
//------------------------------------------------------------------------------
// 返回值: integer
//------------------------------------------------------------------------------
// 日期: 2007-10-06
//==============================================================================
Long ll_row,ll_rowcount,ll_deleterow,ll_rowid
any la_parent,la_data,la_label,la_parent_new,la_data_new,la_label_new
Int i
dwitemstatus l_status
If This.AcceptText() <> 1 Then Return -1
ll_rowcount = This.RowCount()
ll_deleterow = This.DeletedCount()
If ll_rowcount > 0 Then
For ll_row = ll_rowcount To 1 Step -1
l_status = This.GetItemStatus(ll_row, 0, primary!)
If l_status = newmodified! Then //新增
la_parent = This.of_getvalue(ll_row,as_parent)
la_data = This.of_getvalue(ll_row,as_data)
la_label = This.of_getvalue(ll_row,as_label)
Parent.wf_insertitem(ai_level,la_parent,la_label,la_data,ai_index,ab_child) //装载新项
ElseIf l_status = datamodified! Then //修改
la_parent = This.of_getoraginal(ll_row,as_parent) //原始值
la_parent_new = This.of_getvalue(ll_row,as_parent) //当前值
la_data = This.of_getoraginal(ll_row,as_data) //原始值
la_label = This.of_getoraginal(ll_row,as_label) //原始值
la_data_new = This.of_getvalue(ll_row,as_data) //当前值
la_label_new = This.of_getvalue(ll_row,as_label) //当前值
If (la_parent = la_parent_new) And (la_data = la_data_new) And (la_label = la_label_new) Then
Continue; //父项data,当前项data和label没有改变则跳过
End If
Parent.wf_deleteitem(ai_level,la_parent,la_data) //先删除旧项
la_parent = This.of_getvalue(ll_row,as_parent)
la_data = This.of_getvalue(ll_row,as_data)
la_label = This.of_getvalue(ll_row,as_label)
Parent.wf_insertitem(ai_level,la_parent,la_label,la_data,ai_index,ab_child) //装载新项
End If
Next
End If
If ll_deleterow > 0 Then //删除
For i = 1 To ll_deleterow
la_parent = This.of_getdelete(i,as_parent)
la_data = This.of_getdelete(i,as_data)
Parent.wf_deleteitem(ai_level,la_parent,la_data) //删除旧项
Next
End If
Return 1
//其中的of_getoraginal(),
4)update()之前调用该事件,update()之后即可动态刷新树项。
//==============================================================================
// 事件: ue_updatepre:()
//------------------------------------------------------------------------------
// 参数:(无)
//------------------------------------------------------------------------------
// 返回值: integer
//------------------------------------------------------------------------------
// 日期: 2007-10-06
//==============================================================================
Return This.Event ue_refresh_tv(2,'dept_code','user_num','user_name',3,False)
不足之处:没做根项刷新的考虑,对树的层次控制不灵活,只能实现有限的功能,有空的话做成用户对象会更好一些。