PB下使用TreeView控制元件實現多級分類檢索
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事件:該事件在每次變更選擇項後觸發,觸發的同時系統會將變更前後選擇項的控制程式碼通過引數oldhandle、newhandle傳遞過來。
選中該事件主要用來控制DataWindow顯示當前資訊類的內容。這樣每次在TreeView控制元件中選中一個資訊項,DataWindow即刻將其詳細資訊顯示出來。
三、具體應用例項
筆者曾參與開發了一套醫院資訊管理系統,其中當前有效醫囑分類檢索就是採用TreeView控制元件和DataWindow配合完成的,介面上的TreeView控制元件按多級分類體系給出了當前所有有效醫囑專案,每在其中選中一個醫囑專案,旁邊的DataWindow即會列出實施該項醫囑的病人清單,並給出人數統計結果。
其中醫囑專案的分類是這樣進行的:首先根據醫囑的性質進行了一級分類,分為長期、臨時兩大類;在一級分類的基礎上又根據醫囑的種類進行了二級分類,長期醫囑分為藥物類、護理類,臨時醫囑分為藥物類、護理類、檢查類;在二級分類的基礎上又根據醫囑的具體型別進行了三級分類,藥物類分為口服、肌肉注射、靜脈點滴等類,護理類分為特護、一級護理、二級護理等,檢查類分為各類具體檢查,由此形成了三級分類體系。
為了簡化程式設計,視窗上又增設兩個DataStore物件--ds_yzzl和ds_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_yzzl中zl欄位的顯示內容和內部值,
作為這裡對應項的顯示文字和內部值
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
相關文章
- ElasticSearch 實現分詞全文檢索 - 概述Elasticsearch分詞
- 給pb的listview或者treeview控制元件加上背景圖 (轉)View控制元件
- 使用Harr特徵的級聯分類器實現目標檢測特徵
- TKE 使用者故事 - 作業幫 PB 級低成本日誌檢索服務
- ElasticSearch 實現分詞全文檢索 - delete-by-queryElasticsearch分詞delete
- DashVector + DashScope升級多模態檢索
- hibernate(八) Hibernate檢索策略(類級別,關聯級別,批量檢索)詳解
- 控制元件treeview的使用 (轉)控制元件View
- ACCESS TreeView控制元件的使用View控制元件
- Mysql 如何實現全文檢索,關鍵詞跑分MySql
- 基於ElasticSearch實現商品的全文檢索檢索Elasticsearch
- PB TreeView 屬性,事件詳解(轉)View事件
- 如何:使用TreeView控制元件實現樹結構顯示及快速查詢View控制元件
- elasticsearch的實現全文檢索Elasticsearch
- PHP無限級分類的實現(不使用遞迴)PHP遞迴
- mysql 無限級分類實現思路MySql
- C#實現前向最大匹、字典樹(分詞、檢索)C#分詞
- 擊敗二分檢索演算法——插值檢索、快速檢索演算法
- Pb中多使用者許可權管理實現方案 (轉)
- 使用遞迴實現樹狀選單(無限級分類)遞迴
- php + MongoDB + Sphinx 實現全文檢索PHPMongoDB
- 使用PagedDataSource類實現DataList和Repeater控制元件的分頁顯示 (轉)控制元件
- ElasticSearch 億級資料檢索案例實戰Elasticsearch
- TreeView 的派生類: TreeViewEx 實現 NodeShowToolTip、NodeDoubleClick 事件 (轉)View事件
- 教程 | 用Scikit-Learn實現多類別文字分類文字分類
- 【雲圖】自有資料的多邊形檢索(雲檢索)
- 高效能無限級分類實現思路
- torch--多層感知機實現影像分類
- Oracle OCP(15):分層檢索Oracle
- 如何透過Scikit-Learn實現多類別文字分類?文字分類
- 如何通過Scikit-Learn實現多類別文字分類?文字分類
- 如何快速實現高併發短文檢索
- PHP+redis實現超迷你全文檢索PHPRedis
- select下拉選單實現分類級聯效果
- 昆蟲分類與檢索系統的設計與開發
- 儲存系統實現-跳躍表實現索引檢索索引
- ES 筆記二十二:多語言及中文分詞與檢索筆記中文分詞
- 【搜尋引擎】Solr Suggester 實現全文檢索功能-分詞和和自動提示Solr分詞