[摘 要] 介紹TreeView(樹型)控件在信息管理系統開發中的使用方法及如何設計符合應用TreeView控件的數據表結構,并且結合遞歸算法實現TreeView控件在信息管理系統中的應用。
[關 鍵 詞] VFP;TreeView控件;遞歸算法;數據庫;信息管理系統
[中圖分類號] TP311 [文獻標志碼] A [文章編號] 2096-0603(2016)35-0105-01
一、前言
使用TreeView控件表達數據之間具有層次隸屬關系時非常形象直觀,因此TreeView控件在應用程序設計中具有非常重要的作用。可是在VFP開發平臺下,沒有TreeView控件,只能通過ActiveX控件使用TreeView控件,下面以本人為電視臺開發的電視收費管理系統軟件為例說明TreeView控件在VFP中的具體應用。
二、模塊功能介紹
電視收費管理系統的基礎數據表是房屋信息表,字段是編號(主鍵)、小區、樓棟、單元、樓層、門號、姓名等。為了直觀、方便地查找用戶基本信息,在此處采用了TreeView控件組織房屋信息數據檢索。TreeView控件包含三層數據檢索,分別是小區、樓棟、單元,可以根據用戶地址在TreeView控件中一層層地展開數據,相應在窗口的另一側檢索出符合條件的記錄信息。
三、關鍵步驟、技術與核心代碼
1.設計符合應用TreeView控件的數據表結構。(1)建立一個查詢視圖query_tv,內容包括房屋的地址信息及其他相關信息。建立此視圖的好處是可以從若干基礎信息表中提取相關數據,供查詢使用,這樣可以降低代碼復雜度。(2)在此表單的Load事件中加入如下代碼:
Select Distinct xq As dm,xqmc As mc From query_tv Group By xq,xqmcInto Cursor sql_dm_xq
Select Distinct xq,trim(lh)+′棟′ As mc,xq+′-′+lh As dm From query_tv Group By xq,lh,dm Into Cursor sql_dm_lh
Select Distinct xq,lh,trim(dy) +′單元′ As mc,xq+′-′+lh+′-′+dy As dm From query_tv Group By xq,lh,dy,dm Into Cursor sql_dm_dy
此三條SQL語句將生成三個臨時內存表供TreeView控件檢索數據使用。這里使用了一個技巧,就是三個臨時表中的DM字段的設計。最后一個臨時表中的DM字段是由小區、樓棟、單元三個字段復合而成的,當用戶在檢索最后一級節點時,系統實際是檢索復合而成的DM字段,這樣就不用再找它的父節點樓棟的數據及更高節點的數據。在查詢視圖query_tv中設計一個相應的字段DM,包括小區、樓棟、單元,這樣就可以在TreeView控件中點擊任何一層時,系統都能準確檢索出相應數據。
2.在此表單中通過ActiveX控件加入ImageList控件,將TreeView控件使用的圖標都保存在ImageList控件中,每個節點應該顯示的圖標由程序根據用戶的操作進行設置。
3.表單的布局。表單的布局可以借鑒WINDOWS系統中資源管理器的窗口布局,左邊放置一個TreeView控件,用于數據檢索。右邊放置一個Grid控件,用來顯示檢索數據的具體信息。然后可以利用VFP9提供的錨定功能,加入錨定值,以適應各種分辨率。
4.遞歸算法在TreeView控件初始化的應用。(1)在表單中新建字符型屬性組wa_tname[2,3],表示建立了表單級字符型3行2列的二維數組。這個數組用于保存上述三個臨時內存表的名字和特征字符。(2)在表單中新建一個方法wf_treeinitadd,這個方法將采用遞歸算法,把數據填充到TreeView控件中。wf_treeinitadd方法的代碼如下:
Lparameters ps_layer,ps_dm 兩個參數分別為層數和代碼(就是節點的KEY)
SELECT(Thisform.wa_tname(1,ps_layer))
Set Filter To dm =ps_dm
Go Top
Do While Not Eof()
ls_dm =dm
If ps_layer= 1
THISform.tv_1.NODES.ADD(,,Thisform.wa_tname(2,ps_layer) +dm,mc,1,2)
Else
THISform.tv_1.NODES.ADD(Thisform.wa_tname(2,ps_layer -1) +ps_dm,4,Thisform.wa_tname(2,ps_layer) +dm,mc,1,2)
EndIf
If ps_layer Thisform.wf_treeinitadd(ps_layer+1,ls_dm) 此處為遞歸調用,即為此節點下面還有子節點 EndIf SELECT(Thisform.wa_tname(1,ps_layer)) Skip EndDo If ps_layer=Thisform.wi_layer 遞歸返回條件 Return EndIf 對此段代碼中幾個重要的地方做一下說明。wa_tname這個二維數組,第一維保存臨時內存表的名字,第二維保存特征字符。這里為什么需要特征字符呢?因為在TreeView控件中NODE節點的KEY屬性值必須是唯一的,加入特征字符是預防數據表中有重復數據引起系統報錯。 5.現在運行此表單,在TreeView控件將能夠按層顯示房屋檢索信息數據。 四、總結 TreeView控件填充數據的過程就是不停地循環調用直到填充到TreeView控件的末梢節點數據,這個過程正好體現了遞歸算法的精髓,因此實現起來方便,代碼簡潔。并且應用程序使用TreeView控件,可以使人機界面更加友好,更加直觀形象。使應用程序操作簡單,易學易用??傊?,在開發信息管理系統中,TreeView控件具有非常重要的作用,它能使數據之間具有的層次隸屬關系非常形象地表達出來,方便用戶的理解和操作。 參考文獻: [1]張洪舉.Visual FoxPro 6.0~9.0解決方案與范例大全[M].人民郵電出版社,2006. [2]陳宗興Visual FoxPro 6.x 中文版程序設計Internet應用篇[M].中國鐵道出版社,1999.