【文章內容簡介】
。所以,在本課題中也使用數據庫技術進行全部資料,信息的管理,實現信息的集成與系統處理。在數據庫設計過程中就是運用數據庫和文件的形式加以管理,從而在計算機上實現方便的管理,配合網絡,實現這些資源的共享,使異地的開發(fā)人員可以方便的調用。最終反映出來的是設計開發(fā)信息的共享和數據的交換。因為考慮模具開發(fā)的資料、資源,其分類與知識結構符合樹形特點,且用樹形結構直觀易于開發(fā)人員直接使用以及檢索,因其分類明確,且可以無限的擴展內容。:使用控件TreeView。樹形目錄經典的解決方案是用遞歸算法。遞歸算法的優(yōu)點就是簡潔,可擴充性好。為了解決樹在生成過程中的層樹不定的問題,同時也是為了讓樹的擴展性更好。樹的生成使用了遞歸的方法。生成樹的代碼一旦寫成,可以不改動源代碼,生成無限級層次的樹。樹的結構完全由數據庫中表的數據決定。故設計樹形結構目錄的存儲模式:由于樹形結構是一類非線性數據結構,其分支關系,以及同級關系類似于自然界中的樹。參考文獻[14],對樹的存儲結構的分析,由此采用近似的雙親表示法,即每個節(jié)點只有唯一的父節(jié)點。具體參見文獻對算法的描述,此處略??紤]本課題對資料的索引關系要求對其分類明確,雙親表示法中只顯示父級節(jié)點繼承的原理對樹形目錄的管理實現存在一定的難度與繁雜。如在顯示從子節(jié)點找到根節(jié)點的關系時,由于只有一個上級父級節(jié)點的繼承,在顯示繼承關系時,則必須遍歷整個樹開結構,其程序的開銷是得不償失的。故在數據存儲之時,就在存儲完整的樹形繼承關系鏈:“根節(jié)點_父節(jié)點1_父節(jié)點2_父節(jié)點3_...”。如對任一節(jié)點N,其繼承關系字段就存儲為:“0_1_6_...M_”,其中表示的關系就是從根節(jié)點0到1再到6…一直到M,M就表示上一級的節(jié)點值,若此極點再生產子節(jié)點,則子節(jié)點的關系為:“0_1_6_...M_N_”,如此可一目了然的知道其中的父子級的關系,更利于操作。具體樹的生成遞歸算法原理如下圖:是否開始從數據庫取出以0開始的所有根節(jié)點顯示根級內容取父節(jié)點N,父節(jié)點ID自動生成子級繼承關系鏈N_ID從數據庫中取出所有N_ID級的內容顯示判斷是否存在M_ID取父節(jié)點M,父節(jié)點ID自動生成子級繼承關系鏈M_ID結束圖9遞歸原理圖具體遞歸算法代碼如下:void BindTree(TreeView TV) { DataRow [] rs = (TreeID=39。0_39。,pid)。 foreach( DataRow r in rs) { TreeNode rootnode = new TreeNode()。 = r[title].ToString()。 =main。 =images/。 (rootnode)。 = ?node=+()+amp。id=+r[id].ToString()+amp。TreeID=+r[TreeID].ToString()+amp。pid=+r[pid].ToString()。 CreateTree(r[TreeID].ToString()+r[id].ToString()+_,rootnode)。 } } void CreateTree(string TreeID,TreeNode tn) { DataRow [] rs = (TreeID=39。+TreeID+39。,pid)。 foreach( DataRow r in rs ) { TreeNode tempnode = new TreeNode()。 = r[title].ToString()。 =main。 (tempnode)。 =?node=+()+amp。id=+r[id].ToString()+amp。TreeID=+r[TreeID].ToString()+amp。pid=+r[pid].ToString()。 CreateTree(r[TreeID].ToString()+r[id].ToString()+_,tempnode)。 } }其實現原理說明如下:BindTree函數實現樹開目錄的綁定,在BindTree中綁定根節(jié)點,其中數據存儲為“0_”。 是為樹目錄節(jié)點設定顯示的文本, 為節(jié)點設計超鏈接轉向的框架,這里是轉到main框架,這樣使用頁面框架的好處是在每次更改顯示節(jié)點時,可不刷新樹形目錄,如此可大大提高程序的效率,因為相對來說,動態(tài)樹形目錄的顯示,如上述原理,是采用遞歸算法的,雖然遞歸算法有以上所述的優(yōu)點,但其缺點也是很明顯的:低效。因為遞歸就是程序不斷調用自身,對系統的資源消耗比較大。隨著節(jié)點的增多,執(zhí)行效率會變的很低。故若在頁面反復執(zhí)行樹形目錄綁定,則其實現并不合理??紤]至此,在瀏覽器中實現用框架訪問,節(jié)點的超鏈接是指向main框架的,如此,便可避免訪問不同節(jié)點時,達到不刷新樹形目錄頁面,而是在框架指向的頁面中刷新。在完成上述設置后,使用控件TreeView綁定數據,(rootnode)。CreateTree中傳入父節(jié)點的值,自動查找與之匹配的子節(jié)點,對子節(jié)點的綁定,綁定原理與rootnode綁定數據是一樣的。然后自動以子節(jié)點為下一級的父節(jié)點,自動調用CreateTree,如此遞歸,直至遍歷到樹形目錄的最小子級,遞歸結束。實現效果如下圖10:圖10樹形目錄圖并且要實現動態(tài)的管理功能,便于資料的更新。其功能要求添加子目錄,刪除子目錄,編輯標題,添加文章,修改文章等,并要實現更人性的功能:上移,下移功能。更要實現人性化的操作,使用者才能得心應手。故綜合以上因素,設計如下圖11。因規(guī)劃中已對樹形目錄做好了繼承關系的存儲,故目錄的添加與刪除不存在大問題,添加目錄只需找到要節(jié)點,然后根據節(jié)點的關系,生成另一關系鏈存儲即可。但此時排序功能卻是難點之一,因要實現動態(tài)的排序,上移,下移,并要固定改變帶來排序的不同。因此必須在數據存儲時加一標識字段,來標記節(jié)點的排序位置。設計之初,排序的使用了整個樹的排序,加了個字段標識所有的節(jié)點,然其效率低下,因為位置的改變是通過改變繼承關系鏈來改變的,因而一個節(jié)點的改變就可能引起整個樹的位置的改變。再三思索,查閱了順序文件,索引文件的檢索方法,得出,若將關系鏈與排序標識分開,顯示樹形目錄之時,只需提取同級的所以節(jié)點,然后在這所有節(jié)點中標識一個字段來進行排序即可,這種排序不涉及父子級的繼承關系,排序也只在一個樹形分支內完成,與整個樹形的排序相比,其程序的開銷遠遠地小于整體的排序,效率因此也得到了巨大的提高!圖11樹形管理圖 其節(jié)點移動的代碼如下: void Move(string order_str) { string pid1,pid2=,t_pid=99999999。 pid1=Request[pid]。 sql=select * from CATALOG where TreeID=39。+Request[TreeID]+39。 order by pid +order_str。 DataTable dt=(sql)。 int i=0。 foreach(DataRow r in ) { if((r[pid].ToString())==(pid1)) { pid2=[i1][pid].ToString()。 } i=i+1。 } sql=update CATALOG set pid=+t_pid+ where TreeID=39。+Request[TreeID]+39。 and pid=+pid1。 (sql)。 sql=update CATALOG set pid=+pid1+ where TreeID=39。+Request[TreeID]+39。 and pid=+pid2。 (sql)。 sql=update CATALOG set pid=+pid2+ where TreeID=39。+Request[TreeID]+39。 and pid=+t_pid。 (sql)。 }其實質就是進行要改變排序兩行的位置標識,用一臨時變量存儲用于交換即可。在實現代碼中,先取得要移動的兩節(jié)點的PID值:pid1,pid2,并取一臨時變量t_pid,這里t_pid=99999999,因為這個值通過預測不可能出現在程序中,故可用來標識,以便利于實現交換。通過獲取要移動的pid1,按傳入的參數確定上移或下移,再確定與pid1相臨的pid2的值。然后根據樹繼承關系鏈的值TreeID和PID結合,首先把pid1換成t_pid,接著把pid2換成pid1的值,最后把t_pid換回成pid2的值,即實現了上移或下移的交換。然對于移到最上或最下,參考文獻[15],對數據庫技術,利用了一點小技巧,因數據庫本身對數據的處理有Max與Min,故實現移到最上功能代碼如下: sql=select min(pid) from CATALOG where TreeID=39。+TreeID+39。 int MinID=((sql).ToString())1。 sql=update CATALOG set pid=+()+ where ID=+()。 (sql)。其原理如下,先在數據庫中通過sql語句select min(pid) from CATALOG where TreeID=39。+TreeID+39。,從同一級別的TreeID組中,取出最小的PID值MinID,然后要使所選節(jié)點的位置排至最上,則只需把PID值等于MinID值減一即可。反之則移至最下。sql=select max(pid) from CATALOG where TreeID=39。+TreeID+39。 int MaxID=((sql).ToString())+1。sql=update CATALOG set pid=+()+ where ID=+()。(sql)。與移至最上原理相似,先在數據庫中通過sql語句select max(pid) from CATALOG where TreeID=39。+TreeID+39。,從同一級別的TreeID組中,取出最大的PID值MaxID,然后要使所選節(jié)點的位置排至最下,則只需把節(jié)點的PID值等于MaxID值加一即可。最后要實現目錄與詳細資料關聯。上述只是把模具資料的組織形式實現出來,模具資料詳細內容并未呈現。故在此必需實現目錄與模具資料的關聯。其效果如下圖。圖12文章管理圖其實現原理如下,首先在頁面開始載入時,先判斷此目錄節(jié)點是否存在文章。若已有文章,則在頁面所作的工作則是需要去修改更新文章,而不是添加新的文章內容。 if(!) { =(select title from CATALOG where ID=+