使用樹型控制元件顯示資料,現想將treeview控制元件復選框選中的資料顯示在旁邊的dw視窗中,請教怎樣實作。注:如選中為父類項,則dw視窗中顯示只父類data,如選中為子類項,則dw視窗中只顯示子類的data,以下是使用的部分事件代碼:
constructor()事件:
integer li_rowcount,li_row
string li_current_dn,li_last_dn,li_current_ei,li_last_ei,ls_type
//宣告二個樹視圖的實體變數
treeviewitem itvi_level_one,itvi_level_two
long ii_h_l_one
long ii_h_l_two
ls_type='辦公室'
dw_2.settransobject(sqlca)//dw_2 為隱含的資料視窗,存有生成樹的資料
li_rowcount=dw_2.retrieve(ls_type)//行數
dw_2.setsort("bh,name")
dw_2.sort()
//生成樹視圖的各級樹視圖項
for li_row=1 to li_rowcount
//
li_current_dn=dw_2.object.bh[li_row]
//dw_2物件中"bh類別"
li_current_ei=dw_2.object.name[li_row]
//dw_2物件中"gkyy_bm品名"
if isnull (li_current_ei) then
li_current_ei=""
end if
if li_current_dn <> li_last_dn then
//IF bh不與一級視圖項重復
//設定一級樹視圖項
itvi_level_one.label=dw_2.object.dept[li_row]
//視圖項的顯示資訊
itvi_level_one.level=1 //級別
itvi_level_one.data=https://bbs.csdn.net/topics/li_current_dn
//視圖項的內部資訊
itvi_level_one.pictureindex=1
//沒選中時所用的圖示序號
itvi_level_one.selectedpictureindex=3
//選中時使用的圖示序號
itvi_level_one.children=(li_current_ei <> ' ')
//樹視圖是否有下一級
ii_h_l_one=this.insertitemlast(0,itvi_level_one)
//將項加入到一級樹的最后一項
end if
//設定二級樹視圖項
if li_current_dn<>li_last_ei then
if li_current_ei<>' ' then
itvi_level_two.label=dw_2.object.name[li_row]
itvi_level_two.level=2
itvi_level_two.data=https://bbs.csdn.net/topics/li_current_dn
itvi_level_two.pictureindex=2
itvi_level_two.selectedpictureindex=4
itvi_level_two.data=https://bbs.csdn.net/topics/li_current_ei
itvi_level_two.children=false
ii_h_l_two=this.insertitemlast(ii_h_l_one,itvi_level_two)
//將項加入到二級樹的最后一項
end if
end if
li_last_dn=li_current_dn//設比較項
li_last_ei=li_current_ei
next
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
用戶事件ue_statechanged(long handle, integer prevstate)
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
Clicked事件
treeviewitem tvitem
getitem(handle, tvitem)
post event ue_statechanged(handle, tvitem.statepictureindex)
謝謝。。。
uj5u.com熱心網友回復:
使用樹型控制元件顯示資料,現想將treeview控制元件復選框選中的資料顯示在旁邊的dw視窗中,請教怎樣實作。注:如選中為父類項,則dw視窗中顯示只父類data,如選中為子類項,則dw視窗中只顯示子類的data,以下是使用的部分事件代碼其實很簡單,首先要確定 父類data和子類data是否同一表源,欄位是否相同,如果是的話可能通過設定setsqlselect()、動態創建資料視窗 等方法實作
另一個比較笨的方法但實作起來比較簡單,分別建立父類 和子類的 資料視窗
通過 dw_1.DataObject = "d_employ" 來動態設定dataobject
uj5u.com熱心網友回復:
PB自帶示例中就有類似功能uj5u.com熱心網友回復:
一般用datastore來關聯不同級別,判斷為哪個級別后,就直接在datastore里找,找到后,就copy到資料視窗中。或者是用treeviewitem 的data 項來存盤資料的id,再通過select到資料視窗中。
uj5u.com熱心網友回復:
我剛學PB,就是不明白你定義的三個事件分別實作的是什么功能啊?是圖示的變換嗎?
uj5u.com熱心網友回復:
我剛看了關于這個的例子這是寫在OPEN()里的
Integer i,j,li_deptcnt,li_empcnt
Long ll_hd_lv1,ll_hd_lv2,ll_root
string ls_deptnm,ls_tmp,ls_fn,ls_ln,ls_deptid,ls_empid
TreeViewItem ltvi_lv1
DataStore lds_dept,lds_emp
lds_dept = create datastore
lds_dept.dataobject = 'd_department'
lds_dept.settransobject(sqlca)
lds_dept.retrieve()
lds_emp = create datastore
lds_emp.dataobject = 'd_employee'
lds_emp.settransobject(sqlca)
lds_emp.retrieve()
ll_root=tv_1.FindItem(RootTreeItem!,0)//Finds the first item on the first level of a TreeView control
tv_1.setredraw(false)
tv_1.deleteitem(ll_root)
ll_root = tv_1.insertitemlast(0,"部門資訊",1) //回傳根句柄ll_rootitem
li_deptcnt = lds_dept.rowcount()
//messagebox("the cont of dept",string(li_deptcnt))
for i = 1 to li_deptcnt
ls_deptid=lds_dept.getitemstring(i,1)
ls_deptnm = lds_dept.getitemstring(i,2)
ls_tmp=ls_deptid+" "+ls_deptnm
//messagebox("deptinfo",ls_tmp)
ll_hd_lv1=tv_1.insertitemsort(ll_root,ls_tmp,2)
//回傳一個句柄ll_newitem ,作其子項父句柄。ll_rootitem為根句柄
lds_emp.reset()
lds_emp.retrieve(ls_deptid)
li_empcnt=lds_emp.rowcount()
for j = 1 to li_empcnt
ls_empid=lds_emp.getitemstring(j,1)
ls_fn=lds_emp.getitemstring(j,2)
ls_ln=lds_emp.getitemstring(j,3)
ls_tmp=ls_empid+" "+ls_fn+" "+ls_ln
//messagebox("empinfo",ls_tmp)
tv_1.insertitemsort(ll_hd_lv1,ls_tmp,3)
next
next
tv_1.setredraw(true)
destroy lds_dept;
destroy lds_emp;
不過這個代碼里面還是有點問題,沒有過濾的陳述句,會把employee設到沒有department里去
而且,我還有個新增部門的子視窗,可是每次新添資料這個Treeview都不會自動把資料更新,非要關掉重新開才行
uj5u.com熱心網友回復:
可以實作的。你可以先參考下別人寫的實體。我弄這個treeview也弄了很長時間。uj5u.com熱心網友回復:
treeview的使用很復雜我現在只會使用兩層的樹
遍歷太復雜了
uj5u.com熱心網友回復:
想咨詢下,treeview和listview結合,用滑鼠拖動listview的檔案到treeview的檔案夾中,怎么實作轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/81597.html
標籤:控件與界面
下一篇:煩惱啊!
