PB树项动态刷新的简单办法

常见的左边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)

不足之处:没做根项刷新的考虑,对树的层次控制不灵活,只能实现有限的功能,有空的话做成用户对象会更好一些。

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值