PB中TreeView控件使用技巧 |
來自http://news.it.oaod.com/PcTech-1-24486.html |
PowerBuilder中的TreeView 控件爲樹狀遊覽,類似於WINDOWS的資源管理器,其特點是信息項呈樹狀層次結構,能更清晰地表現主、細目關係 ,操作非常方便。在應用中可將其與DataWindow 配合使用, 一個提供信息的分類體系,一個提供具體信息,達到珠連碧合的奇妙效果。它特別適用於多級信息的分類檢索, 是多級菜單所無法比似的,它的表現形式深受程序設計人員和廣大用戶的喜愛,在許多應用軟件中都能看到她的英姿。 在PowerBuilder下,TreeView 控件的應用較其它控件要複雜得多,剛接觸它時往往有些不知所措。但如果將它的機理搞清楚,掌握它也不是很難的事。下面我結合長白公司圖書分類檢索的實例,把TreeView 控 件的使用方法和大家探討一下。 一、應用TreeView 控件的一般步驟 1、 建立一個應用,並設好與數據庫的接口,這是操作數據庫的前提。 2、 在應用中建一應用窗口W_1,在其上加入二個名爲dw_3和dw_4的datawindow控制對象和一個名爲TV_1的TreeView對象。 3、 修改DW_3屬性 General:把Datawindow object name填寫一個已存在的名爲DW_date的datawindow(注意:它與datawindow控制對象是不同的),用於生成樹視圖項,將其Visible項設爲不可見。 4、 修改DW_4屬性 General:把Datawindow object name填寫一個已存在的名爲DW_TS的datawindow對象,用於顯示查詢出的具體內容。 5、 編輯TV_1的屬性 TreeView的樹視圖項不能直接編輯,必須在Script中編寫程序。 Picture:在Picture Name中加入四個不同的圖標,用於代表樹視圖中的兩個層次(一、二級)、兩種狀態(未選、選中)。 General:可根據具體應用設定是否選中,其中: Delete Items:運行中是否允許刪除表項。 Disable PragDrog: 運行中是否允許拖放表項。 Edit Labels: 運行中是否允許單擊表項來改變表項的標題。 Show Buttons:是否在表項放顯示+-按鈕,有示相對的擴展和收縮。 Hide Selection:當該控件失去焦點時,選中項是否以高亮度顯示。 Show Line:表項間是否加一豎線。 Lines At Root:所有根層表項是否用豎線連接。 Indentation:子表項相對於父表項的向右縮進度。 6、 編寫TV_1的Script 這裏是TreeView控件的關鍵,也是難點。 二、TreeView 控件的信息構成及創建 樹視圖項TreeViewItem是TreeView 控件的基本信息單位,樹視圖項的生成一般有二種方法,一種是先生成根層視圖項,再在應用中動態生成下級視圖項,另一種是把全部樹視圖項一次和成。兩種方法各有優點,請根據具體情況選用,本例中採用後一種方法。 1、 樹視圖項TreeViewItem的主要屬性 Label:String 型,樹視圖項的顯示信息。 Data:Any型,樹視圖項的內部值。 Level:Integer型,樹視圖項在樹視圖中級別。 Children:Boolean 型,它決定該項是否有下一層(如圖中書名)。 PictureIndex:Integer 型,該項非選中時所用的圖標在圖標隊列中的編號。 SelectedPictureIndex:Integer型,該項選中時所用的圖標在圖標隊列中的編號。 2、 生成TreeViewItem項用到的函數 InsertItemFirst():將加入項作爲第一項 InsertItemLast():將加入項作爲最後一項 InsertItem():將加入項插入到指定項的後面 InsertItemSort():按順序放置。 3、 TreeView的常用事件 Constructor: 該事件在控件創建時觸發,可在這裏構造TreeViewItem。 Click:單擊TreeViewItem項時,執行查詢程序。 Double Click: 雙擊TreeViewItem項時,執行查詢程序。 ItemPopulate 事件: 該事件在某TreeViewItem項首次展開時觸發, 觸發的同時系統會將 該TreeViewItem項的句柄通過參數handle 傳遞過來。它主要用來生成對應項的下層信息項。主要用於第一種方法。 三、 事件代碼 1、樹視圖控件TV_1的constructor事件代碼 wanqi 1999.6.28 integer li_rowcount,li_rowstring li_current_dn,li_last_dn,li_current_ei,li_last_ei //聲明二個樹視圖的實例變量 treeviewitem itvi_level_one,itvi_level_two //long ii_h_l_one //long ii_h_l_two dw_3.settransobject(sqlca)//dw_3 爲隱含的數據窗口,存有生成樹的數據 li_rowcount=dw_3.retrieve()//行數 dw_3.setsort("lb,pm") dw_3.sort() //生成樹視圖的各級樹視圖項 for li_row=1 to li_rowcount li_current_dn=dw_3.object.lb[li_row] //DW_3對象中"LB類別" li_current_ei=dw_3.object.pm[li_row] //DW_3對象中"PM品名" if isnull (li_current_ei) then li_current_ei="" end if if li_current_dn< >li_last_dn then //IF LB不與一級視圖項重複 //設置一級樹視圖項 itvi_level_one.label=dw_3.object.LB[li_row] //視圖項的顯示信息 itvi_level_one.level=1 //級別 itvi_level_one.data=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) 2、tv_1控件的clicked事件代碼 string s1 |
end choose