過林吉
摘要:該文通過實例,闡述了如何用遞歸算法,配合TreeView控件來實現(xiàn)目錄樹形式加載數(shù)據(jù),完成窗體程序設(shè)計中地區(qū)信息的加載,大大提高編程的效率。
關(guān)鍵詞:遞歸算法;TreeView控件;節(jié)點;數(shù)據(jù)加載
中圖分類號:TP311 文獻標識碼:A 文章編號:1009-3044(2017)36-0086-02
Abstract: This article describes how to use the recursive algorithm by an example, with the TreeView control to achieve the directory tree form on loading data, complete the form of program design on the area of information loading, greatly improve the efficiency of programming.
Key words: Recursive Algorithm; TreeView Control; Node; Data Loading
1 背景
在程序設(shè)計中,經(jīng)常要用到“遞歸”,使用遞歸算法可以把復(fù)雜的問題轉(zhuǎn)化為規(guī)??s小的同類問題的子問題,然后通過遞歸調(diào)用解決。本文將闡述在窗體程序設(shè)計中如何通過遞歸算法來實現(xiàn)數(shù)據(jù)加載的過程,從而巧妙解決地區(qū)加載的問題。
2 遞歸算法的特點及形式
遞歸是設(shè)計和描述算法的一種有力工具,它在復(fù)雜算法的描述中經(jīng)常采用。遞歸的目的是簡化程序設(shè)計,使程序易讀,但遞歸也增加了系統(tǒng)開銷。時間上,執(zhí)行調(diào)用與返回的額外工作要占用CPU時間??臻g上,隨著每遞歸一次,棧內(nèi)存就多占用一截。相應(yīng)的非遞歸函數(shù)雖然效率高,但卻比較難編程,而且相對來說可讀性差。
能采用遞歸描述的算法通常有這樣的特征:有反復(fù)執(zhí)行的過程,其實就是調(diào)用自己;有跳出反復(fù)執(zhí)行過程的條件,即遞歸出口。將一個解決問題轉(zhuǎn)化為解決他的子問題,而他的子問題又變成子問題的子問題,也就是說存在相同的邏輯歸納處理項??梢允褂谩皻w納法”來實現(xiàn)遞歸問題,故遞歸問題的一般解決形式如圖1所示。
3 TreeView控件的特點
TreeView控件用來顯示信息的分級視圖,如Windows里的資源管理器的目錄。TreeView控件中的各項信息都有一個與之相關(guān)的Node對象。TreeView顯示Node對象的分層目錄結(jié)構(gòu),每個Node對象均由一個Label對象和其相關(guān)的位圖組成。TreeView控件一般用來顯示文件和目錄結(jié)構(gòu)、文檔中的類層次、索引中的層次和其他具有分層目錄結(jié)構(gòu)的信息,可以一目了然地表示某種層次關(guān)系。
TreeView控件數(shù)據(jù)源綁定時,樹節(jié)點信息存儲和加載的方法是:創(chuàng)建一個數(shù)據(jù)表,表中的字段根據(jù)實際業(yè)務(wù)確定,其中一個字段保存節(jié)點的編號,記錄當前節(jié)點的標識。另外一個字段來保存節(jié)點在樹形控件上要顯示的信息,可以設(shè)置給Node對象的Text屬性。此外還需要一個字段保存當前節(jié)點的父節(jié)點編號。這兩個字段組合起來, 可以記錄樹上節(jié)點間的層次結(jié)構(gòu),相當于一個“鏈表”。這樣,通過遞歸算法生成樹形結(jié)構(gòu)目錄,可以大大提高編程的效率。
4 實例程序?qū)崿F(xiàn)過程
4.1 實例說明
筆者所舉實例的效果是:從后臺數(shù)據(jù)庫中把地區(qū)信息的數(shù)據(jù)檢索出來放到TreeView視圖控件中構(gòu)建一個樹型目錄,客戶端用戶可以操作該樹型目錄。后端數(shù)據(jù)庫服務(wù)器使用SQL Server, 開發(fā)語言選用C#語言。表1是地區(qū)(Area)數(shù)據(jù)表中字段的定義。
4.2 具體實現(xiàn)
實例中只使用一個TreeView控件,涉及控件的操作不是本文闡述的重點。以下具體闡述如何使用遞歸來實現(xiàn)如圖2所示的加載地區(qū)效果。
1) 后臺數(shù)據(jù)讀取代碼說明
在主窗體FArea中創(chuàng)建一個方法(ExcuteDataTable),用來從后臺數(shù)據(jù)庫中取得需要的數(shù)據(jù),方法有兩個參數(shù),參數(shù)1保存用戶所需數(shù)據(jù)執(zhí)行的sql語句;參數(shù)2保存sql語句中所用到的參數(shù)化對象。ExcuteDataTable方法的代碼如圖3所示。
2) 遞歸算法讀取數(shù)據(jù)并加載到TreeVie控件的節(jié)點
在主窗體FArea中再創(chuàng)建一個方法(LoadArea),方法有兩個參數(shù),參數(shù)1保存父節(jié)點對象;參數(shù)2保存父節(jié)點對象的編號。
方法的作用:從后臺數(shù)據(jù)庫中取得所有地區(qū)的數(shù)據(jù)信息,循環(huán)取得每條記錄。每條記錄包含三個字段,地區(qū)編號(ar_id)、地區(qū)名稱(ar_name)、父節(jié)點編號(ar_uid)。每條記錄用一個節(jié)點對象(TreeNode)來存儲,同時對該條記錄中父節(jié)點編號進行判斷,如果父節(jié)點編號為0,說明這條記錄表示是省份信息,這些節(jié)點是根節(jié)點直接加到TreeView的根節(jié)點目錄中,否則的話就加到父節(jié)點目錄下,作為父節(jié)點的子節(jié)點。然后遞歸調(diào)用方法(LoadArea),將當前節(jié)點對象(TreeNode)以及當前節(jié)點地區(qū)編號(ar_id)作為參數(shù)傳入方法。LoadArea方法的代碼如圖4所示。
3) 主窗體FArea的Load事件中調(diào)用方法LoadArea
在主窗體FArea的窗體Load事件中調(diào)用方法LoadArea,第一次調(diào)用方法時傳入?yún)?shù)1為null;參數(shù)2為0,即LoadArea(null,0)。
5 結(jié)束語
在上述實例中,要將數(shù)據(jù)庫中數(shù)據(jù)在樹型控件中表示,直接用編程實現(xiàn)比較復(fù)雜,而采用遞歸方法生成樹型視圖,可以提高編程效率。并且要注意的是,節(jié)點標識號必須唯一,可將該字段設(shè)置為主鍵。
參考文獻:
[1] 楊祖龍, 吳國平. 遞歸算法在樹型視圖中的應(yīng)用[J]. 計算機工程, 2002(11):139-141.
[2] 傳智播客高教產(chǎn)品研發(fā)部. C#程序設(shè)計基礎(chǔ)入門教程[M]. 北京: 人民郵電出版社, 2014.