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)

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

当数据存在主次表时,当更新了次表数据后,主表数据在后台有更变时。可利用刷新主表当前行的方法重显主表数据。 /************************************************************ 函数名称: f_refresh_currentrow(adw) 功 能: 刷新DW当前行数据,不可刷新NO update or 带arguments的DW 参数说明: adw 目标DW 返 回 值: integer 成功返回1,失败返回-1 作 者: sean 创建时间: 2010年8月18日 ************************************************************/ string ls_dataobject string ls_keys[] //key Column Name string ls_dbname[] //key field Name string ls_coltype[] //field style string ls_tablenm //table name string ls_condition //sql Condition long ll_currentrow //Current Row numeric long ll_column //Column count integer i datawindow ldw datastore ldatastore ldw=adw if ldw.rowcount( )=0 then return -1 elseif trim(ldw.describe( "datawindow.table.arguments"))<>'?' then messagebox('','刷新数据窗口当前行失败!,数据窗口需要参数',exclamation!) return -1 else ll_currentrow=ldw.getrow( ) FOR ll_column = 1 TO long(ldw.object.datawindow.column.count)//key names If ldw.Describe("#"+string(ll_column)+".key") ='yes' Then i++ ls_keys[i]=ldw.Describe("#"+string(ll_column)+".name") ls_dbname[i]=ldw.Describe("#"+string(ll_column)+".dbname") ls_coltype[i]=ldw.Describe("#"+string(ll_column)+".coltype") End If NEXT if upperbound(ls_keys[])=0 then messagebox('','刷新数据窗口当前行失败!,没有主键',exclamation!) return -1 else ls_tablenm=left(ls_dbname[1],pos(ls_dbname[1],'.') -1) //table name for i=1 to upperbound(ls_keys[]) if pos('numb,deci,long,',LeftA(ls_coltype[i],4) +',')>0 then ls_condition+="and "+ls_dbname[i]+"="+string(f_getitem(ldw,ll_currentrow,ls_keys[i])) else ls_condition+="and "+ls_dbname[i]+"='"+string(f_getitem(ldw,ll_currentrow,ls_keys[i]))+"'" end if next ls_condition=mid(ls_condition,4) //sql Condition ldatastore=create datastore ldatastore.dataobject=ldw.dataobject ldatastore.settransobject( sqlca) if f_addwhere_retrieve(ldatastore,ls_condition)=1 then if ldatastore.rowcount( )=1 then ldw.object.data[ll_currentrow]=ldatastore.object.data[1] ldw.setitemstatus( ll_currentrow, 0, primary!, NotModified!) //if ldw.getrow( )<>ll_currentrow then ldw.scrolltorow( ll_currentrow) end if else messagebox('','刷新数据窗口当前行失败!,条件语法错误',exclamation!) return -1 end if destroy ldatastore end if end if
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值