PB下使用TreeView控制元件實現多級分類檢索

秋高工作室發表於2016-03-23

PowerBuilder中的TreeView控制元件為樹狀列表,其特點是資訊項呈樹狀層次結構,且形式靈活,可展開也可回縮,使用滑鼠進行控制,操作簡便。因此在應用中,可將其與DataWindow配合,一個提供資訊的分類體系,一個提供具體資訊,實現資訊的多級分類檢索,這樣可大大地方便查詢,提高系統的實用性。

    PowerBuilder,TreeView控制元件的開發技術一般較為複雜,但如果將它的構成機制及主要事件、函式領會清楚,掌握它並不困難。下面就是使用TreeView控制元件實現多級分類檢索涉及的主要開發技術。

一、TreeView控制元件的資訊構成及建立

    TreeView控制元件的基本資訊單位是TreeViewItem,它們按樹狀層次結構進行組織,每個TreeViewItem項一般具有下列主要屬性:

    Data:Any型別資料,該項對應的內部值。

    Label:String型資料,該項對應的顯示文字。

    Children:Boolean型資料,Ture時表示該項還有下一層(如圖1中項item1),False時表示該項沒有下層,不能被展開(如項         item111)

    PictureIndex:Integer型數值,該項對應的正常圖示在圖示佇列中的編號。

    SelectedPictureIndex:Integer型數值,該項對應的選中圖示在圖示佇列中的編號。

    通過TreeView控制元件查閱資訊,首先要將資訊轉化成相應的TreeViewItem,插入到TreeView控制元件中。這個工作可藉助PB提供的函式來完成。

二、TreeView控制元件實現多級分類檢索涉及的主要事件

    TreeView控制元件和DataWindow配合,完成資訊的多級分類檢索,開發過程主要涉及下列三個TreeView事件:

    Constructor事件:該事件在控制元件建立時觸發

    選中該事件主要用來插入第一層TreeViewItem,這樣使用者一進入檢索介面,第一層資訊項就會出現在控制元件中。

    ItemPopulate事件:該事件在某TreeViewItem項第一次展開時觸發,觸發的同時系統會將該TreeViewItem項的控制程式碼通過引數handle傳遞過來。

    選中該事件主要用來插入當前TreeViewItem項對應的下層資訊項。選擇這個事件插入下層資訊項,開發時只需考慮插入本項的直     屬下層,不必去管下層的下層,可大大簡化開發工作;另外,由於使用者在執行查詢時一般只涉及一些個別類,那些沒有涉及的資訊類沒有展     ,因而沒有必要建立下層資訊項,在這裡做到了,因此改善了應用的執行效率。

    SelectionChanged事件:該事件在每次變更選擇項後觸發,觸發的同時系統會將變更前後選擇項的控制程式碼通過引數oldhandlenewhandle傳遞過來。

    選中該事件主要用來控制DataWindow顯示當前資訊類的內容。這樣每次在TreeView控制元件中選中一個資訊項,DataWindow即刻將其詳細資訊顯示出來。

三、具體應用例項

    筆者曾參與開發了一套醫院資訊管理系統,其中當前有效醫囑分類檢索就是採用TreeView控制元件和DataWindow配合完成的,介面上的TreeView控制元件按多級分類體系給出了當前所有有效醫囑專案,每在其中選中一個醫囑專案,旁邊的DataWindow即會列出實施該項醫囑的病人清單,並給出人數統計結果。

    其中醫囑專案的分類是這樣進行的:首先根據醫囑的性質進行了一級分類,分為長期、臨時兩大類;在一級分類的基礎上又根據醫囑的種類進行了二級分類,長期醫囑分為藥物類、護理類,臨時醫囑分為藥物類、護理類、檢查類;在二級分類的基礎上又根據醫囑的具體型別進行了三級分類,藥物類分為口服、肌肉注射、靜脈點滴等類,護理類分為特護、一級護理、二級護理等,檢查類分為各類具體檢查,由此形成了三級分類體系。

    為了簡化程式設計,視窗上又增設兩個DataStore物件--ds_yzzlds_yzjtzl,其中ds_yzlx的作用是根據醫囑性質到庫中提取當前醫囑種類,ds_yzjtlx則是根據醫囑性質、種類到庫中提取當前有效醫囑的具體型別。

    下面即是3個事件的對應指令碼

 TreeView控制元件Constructor事件

    TreeViewItem tv_new

//建立一個圖示佇列,供其中的TreeViewItem項引用,在這裡建立主要是為了能夠控制圖示大小

//首先設定圖示顯示尺寸

This.PictureHeight=15

This.PictureWidth=16

//圖示佇列由4個圖示構成,3個用於標識醫囑類專案的級別,4個用於標識專案的選中狀態

This.AddPicture("DosEdit5! ")

This.AddPicture("custom023!")

This.AddPicture("custom036!")

This.AddPicture("Custom050!")

//建立第一級醫囑類專案,本級專案共兩個,一個是長期醫囑專案,一個是臨時醫囑專案

tv_New.Label='長期醫囑'

tv_New.Data='0'

tv_New.PictureIndex=1

tv_New.SelectedPictureIndex=4

tv_New.Children=True

This.InsertItemLast(0, tv_New)

tv_New.Label='臨時醫囑'

tv_New.Data=' 1’

This.InsertItemLast(0, tv_New)

TreeView控制元件的ItemPopulate事件

Integer Level, n, I

string Parm1, Parm2

Long 11_Parent

TreeViewItem tv_Current, tv_Parent, tv_New

//由控制程式碼獲得TreeViewItem,存入變數tv_Current

GetLtem(handle, tv_Current)

Level=tv_Current, Level+1

tv_New. PictureIndex=Level

tv_New.SelectedPictureIndex= 4

//根據展開級別,建立當前展開專案

CHOOSE CASE Level

CASE 2

//展開第2級醫囑類專案

tv_New.Children=True

Parm1= tv_Current, Data

//通過ds_yzzl檢索當前專案類所具有的醫囑種類

n= ds_yzzl.Retrieve(Parm1)

//依次到ds_yzzl中提取醫囑種類,建立該專案

FOR i=1 TO n

//ds_yzzlzl欄位的顯示內容和內部值,

作為這裡對應項的顯示文字和內部值

tv_New.Label=ds_yzzl.Describe("evaluate

('lookupdisplay(zl)',"+ string(i)+")")

tv_New.Data=ds_yzzl.GetItemString(i, 'zl')

This.InsertItemLast(handle, tv_New)

NEXT

CASE 3

//展開第3級醫囑類專案

tv_New.Children=false

//由控制程式碼獲取其父項的控制程式碼

11_Parent=FindItem(ParentTreeItem!,handle)

GetItem(11_Parent, tv_Parent)

Parm1=tv_Parent.Data

Parm2=tv_Current.Data

//通過ds_yzjtlx檢索當前醫囑類所具有的具體醫囑型別

n=ds_yzjtlx.retrieve(Parm1, Parm2)

//依次到ds_yzjtlx中提取具體醫囑型別,建立該專案

FOR i=1 TO n

tv_New.Label=ds_yzjtlx.Describe("evaluate

('lookupdisplay(jtlx)',"&+ string(i)+")")

tv_New.Data= ds_yzjtlx.GetItemString(i,'jtlx')

This.InsertItemLast(handle, tv_New)

NEXT

END CHOOSE

TreeView控制元件的SelectionChanged事件

integer Level,

string Parm1, Parm2, Parm3

long 11_Parent

TreeViewItem tv_Current, tv_ Parent

GetItem(newhandle, tv_Current)

Level=tv_Current.Level

//判斷當前專案是否為第3級醫囑類,

如是讓旁邊的DataWindow列出實施該項醫囑的病人清單

//否則,將其置空。

IF Level=3 THEN

11_Parent=FindItem(ParentTreeItem!,newhandle)

getitem(11_Parent, tv_Parent)

Parm2=tv_Parent.data

11_Parent=FindItem(ParentTreeItem!, 11_Parent)

GetItem(11_Parent, tv_Parent)

Parm1=tv_Parent.data

Parm3=tv_Current.data

dw_1.SetFilter("xz='"+Parm1"'and zl'"

+parm2+"'and jtlx='+Parm3+"'")

dw_1. Filter()

ELSE

dw_1.SetFilter('1=2')

dw_1. Filter()

end if

相關文章