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