葉小艷(廣州大學(xué) 華軟軟件學(xué)院網(wǎng)絡(luò)技術(shù)系,廣東 廣州 510990)
科技與應(yīng)用
用于MRP開發(fā)的樹表復(fù)合型控件的設(shè)計
葉小艷
(廣州大學(xué) 華軟軟件學(xué)院網(wǎng)絡(luò)技術(shù)系,廣東 廣州 510990)
MRP數(shù)據(jù)庫中的數(shù)據(jù)之間存在多層從屬關(guān)系,實際應(yīng)用中既要顯示數(shù)據(jù)的樹狀結(jié)構(gòu),也要顯示數(shù)據(jù)的細節(jié),但現(xiàn)有控件對開發(fā)的支持度不夠。設(shè)計一個繼承自DataGridView的自定義控件─TreeGrid,融合了TreeView和DataGridView的顯示風(fēng)格,能對傳入的數(shù)據(jù)進行預(yù)處理,形成分層結(jié)構(gòu),并在此基礎(chǔ)上,實現(xiàn)數(shù)據(jù)的分層網(wǎng)格顯示,方便用戶直觀地展開和收縮層級數(shù)據(jù),進行數(shù)據(jù)的增刪改查操作,也使程序開發(fā)者能夠按需調(diào)用,提高開發(fā)效率。
MRP;自定義控件;樹視圖控件
MRP(Material Requirement Planning,物料需求計劃)用于企業(yè)的庫存和生產(chǎn)管理,它根據(jù)總生產(chǎn)進度計劃中所規(guī)定的最終產(chǎn)品的交貨日期,編制裝配件、部件、零件的生產(chǎn)進度計劃、對外的采購計劃、對內(nèi)的生產(chǎn)計劃,從而計算物料需求量和需求時間,以降低物料庫存量[1]。
MRP必須根據(jù)各層次物品的從屬和數(shù)量關(guān)系,以每個物品為計劃對象,以完工時期為時間基準(zhǔn)倒排計劃,按提前期長短區(qū)別各個物品下達計劃時間的先后順序,這些數(shù)據(jù)存放在數(shù)據(jù)庫中,通過應(yīng)用軟件展示給用戶[2]。顯示時,一方面要用樹狀結(jié)構(gòu)展示多層從屬關(guān)系,另一方面需要對數(shù)據(jù)進行增加、刪除、修改、查找等操作,并顯示數(shù)據(jù)的詳細內(nèi)容[3]。
采用C#開發(fā)數(shù)據(jù)庫系統(tǒng)時,通常用到TreeView控件和DataGridView控件。TreeView控件用來顯示信息的分級樹狀視圖,但只能顯示一列數(shù)據(jù);DataGridView控件可以直觀地顯示和編輯多行多列的表格數(shù)據(jù),但又不能夠反映樹狀結(jié)構(gòu),所以系統(tǒng)開發(fā)者在利用這兩種控件的時候,常需要做一些額外的重復(fù)開發(fā)工作。根據(jù)MRP的應(yīng)用層需求,設(shè)計一個自定義控件,名為TreeGrid,解決MRP中層次化數(shù)據(jù)的顯示問題,讓MRP系統(tǒng)程序開發(fā)者按需調(diào)用本控件,提高開發(fā)效率[4]。
1.1控件樣式
TreeGrid控件樣式如圖1所示。其中:0、1、2、3、4等數(shù)字表示數(shù)據(jù)的層級,數(shù)項1、數(shù)項2等是數(shù)據(jù)表中的原始數(shù)據(jù);“—”表示該項包含子項,“○”表示是最低層次的節(jié)點??丶梢哉归_和收縮,體現(xiàn)了樹狀數(shù)據(jù)的操作邏輯,也可以顯示詳細的數(shù)據(jù)項,體現(xiàn)了網(wǎng)格視圖的顯示邏輯。
圖1 TreeGrid控件的外觀樣式
1.2調(diào)用接口
當(dāng)開發(fā)者需要顯示樹狀結(jié)構(gòu)數(shù)據(jù)時,需調(diào)用TreeGrid控件的AddData()方法。AddData()方法有兩個重載:一個是AddData(DataSet ds),另一個是AddData(DataTable dt)。實際上,AddData (DataSet ds)在內(nèi)部調(diào)用AddData(DataTabe dt)。
2.1數(shù)據(jù)預(yù)處理
數(shù)據(jù)表進入到內(nèi)存后,依據(jù)數(shù)據(jù)之間的從屬關(guān)系,給數(shù)據(jù)表加上一個整形字段用于顯示數(shù)據(jù)的層級:以1表示第一層、以2表示第二層,以此類推。按照深度優(yōu)先算法遍歷所有數(shù)據(jù)并將數(shù)據(jù)重新排序,使其符合樹狀結(jié)構(gòu):兩個1級數(shù)據(jù)之間的2級數(shù)據(jù)從屬于上一個1級數(shù)據(jù),兩個2級數(shù)據(jù)之間的3級數(shù)據(jù)從屬于前一個2級數(shù)據(jù),以此類推(如圖2所示)。
圖2 數(shù)據(jù)層級與樹結(jié)構(gòu)的對應(yīng)關(guān)系
2.2加載并顯示數(shù)據(jù)
圖3 TreeGrid顯示樹狀結(jié)構(gòu)數(shù)據(jù)的流程圖
加載并顯示樹狀結(jié)構(gòu)數(shù)據(jù)流程如圖3所示。
設(shè)置一個用于記錄上一條數(shù)據(jù)層級的指針變量tempLV,以及用于保存某一層級最后出現(xiàn)的位置的泛型集合listLastLV。tempLV默認指向0的位置,listLastLV默認存在listLastLV[0] =0。curLV指針變量表示數(shù)據(jù)源中當(dāng)前遍歷到的數(shù)據(jù)的層級,控件規(guī)定數(shù)據(jù)源表示層級的數(shù)據(jù)在第一列中。控件會比較curLV和tempLV的值。
當(dāng)curLV>tempLV時,表示該數(shù)據(jù)屬于上一條數(shù)據(jù),即tempLV所指的數(shù)據(jù)包含curLV所指的數(shù)據(jù)。tempLV所指的數(shù)據(jù)的相應(yīng)層級列的值將記為“─”,表示可展開并已展開。
隨著電力市場競爭加劇,電力營銷的風(fēng)險也會加劇,企業(yè)經(jīng)營風(fēng)險也會大幅提升。因此,為了企業(yè)的發(fā)展和未來,必須盡快建立并實施電力營銷風(fēng)險管理體制,以電力用戶以及市場經(jīng)濟需求為導(dǎo)向,以提供優(yōu)質(zhì)高效的電力服務(wù)為手段,在最大化保障電力用戶合法利益的同時盡可能的提升企業(yè)自身的經(jīng)濟效益,從而促使企業(yè)健康問題發(fā)展和提升社會服務(wù)形象。
之后,將curLV所指的行索引記入listLastLV中對應(yīng)位置,如當(dāng)指向索引為x、層數(shù)為y的數(shù)據(jù),記listLastLV[y] =x。tempLV指針向下移,curLV指針指向下一條數(shù)據(jù),重復(fù)進行比較。
當(dāng)curLV=tempLV時,表示該數(shù)據(jù)和上一條數(shù)據(jù)屬于同一層,tempLV所指的數(shù)據(jù)的相應(yīng)層級列的值將記為“○”,表示不可展開。
當(dāng)curLV<tempLV時,表示該數(shù)據(jù)不屬于上一條數(shù)據(jù),tempLV所指的數(shù)據(jù)的相應(yīng)層級列的值將記為“○”,表示不可展開。
當(dāng)curLV指向數(shù)據(jù)最后一行并完成操作時,由于數(shù)據(jù)源遍歷完畢,tempLV并不能下移,所以要對最后一行數(shù)據(jù)直接進行處理。因為是最后一行數(shù)據(jù),可以確定為不能展開,直接在相應(yīng)層級記“○”。
2.3展開和收縮條目
展開子條目有兩種選擇:一種是展開到指定條目的下一級,另一種是把指定條目下的所有子條目展示出來。默認用鼠標(biāo)點擊“+”時展開到下一級,開發(fā)者可以通過設(shè)置控件的ExpandAll屬性更改鼠標(biāo)點擊的操作。開發(fā)者也可以通過調(diào)用ExpandRow()和ExpandRowAll()來展開條目。
1)展開一層。
圖4 展開條目一層程序流程
2)展開全部子條目。
當(dāng)要展開某條目的全部子條目時,控件同樣從該條目的下一條開始遍歷。如果遍歷中的條目的lv大于要展開的條目的lv,就說明遍歷中的條目屬于要展開的條目,令該條目可見。當(dāng)遇到遍歷中的條目lv不大于要展開的條目的lv,說明從這條開始不再屬于要展開的條目,控件終止遍歷。遍歷完成或終止后展開完畢。如圖5所示。
圖5 展開全部子條目的流程
3)收縮條目功能。
當(dāng)要收起某條目時,控件從該條目的下一條開始遍歷。在令遍歷中的條目不可見前,先判斷該條目的lv是否不大于要展開的條目的lv,如是,說明從這條目開始不屬于要收起的條目,終止遍歷。設(shè)該條目不可見后,如果該條目是它所處層級的最后一個時,終止遍歷。遍歷完成或終止后收起完畢。如圖6所示。
本控件文件是TreeGrid.dll,當(dāng)開發(fā)者需要應(yīng)用此控件時,只需要在項目中添加此dll,然后在工具箱的選擇項中添加dll后即可在工具箱中找到此控件,具體操作如下:
首先,在工具箱中點擊鼠標(biāo)右鍵,找到“選擇項”。點擊“選擇項”后需要等待比較長的時間,之后會出現(xiàn)“選擇工具箱項”窗口,點擊“.NET Framework組件”選項卡里的“瀏覽”按鈕,在文件選擇器中找到并打開TreeGrid.dll文件。打開TreeGrid.dll后,“.NET Framework組件”選項卡內(nèi)會自動勾選并指向TreeGrid,如圖7所示。此時只要按“確定”,工具箱中就會添加該控件。
圖6 收起條目流程
圖7 被勾選的TreeGrid
其次,開發(fā)者已經(jīng)可以從工具箱中拖放TreeGrid控件到程序界面布局了。但是要調(diào)用控件的方法,還需要向程序引用添加控件的引用,如圖8。
圖8 向程序添加引用
控件的命名空間是TreeGrid,要調(diào)用控件的公開方法,還需要使用完全限定名稱,或者添加using。如圖9。
最后,在向本控件添加數(shù)據(jù)時,可以根據(jù)需要選擇調(diào)用的方法。當(dāng)只需要滿足一般的數(shù)據(jù)顯示需求時,可以使用繼承自DataGridView的DataSource屬性添加數(shù)據(jù);當(dāng)需要顯示BOM時,需要調(diào)用AddData()方法,如圖10。
圖9 需要添加using TreeGrid
圖10 添加數(shù)據(jù)流程圖
本控件適用于處理樹狀結(jié)構(gòu)(即層次化結(jié)構(gòu))數(shù)據(jù),只要數(shù)據(jù)庫中的數(shù)據(jù)體現(xiàn)了從屬關(guān)系,經(jīng)過預(yù)處理,都可以在控件中展現(xiàn)出來[5]。對于開發(fā)者而言,直接引用此控件,可以實現(xiàn)相關(guān)應(yīng)用的大部分功能,有效提高開發(fā)效率。本控件大多數(shù)操作需要使用函數(shù)來調(diào)用,并沒有給出屬性設(shè)計,有需要的控件開發(fā)者可以編寫更多屬性來代替函數(shù)調(diào)用,用以提升控件的易用性。
[1]黃尹國,吳曙光.生產(chǎn)庫存管理新方法:MRP[M].北京:機械工業(yè)出版社,1987:1-2.
[2]物資需求計劃[EB/OL].(2013-04-08)[2014-03-20]. http://wiki.mbalib.com/wiki//物資需求計劃.
[3]耿慶田,狄婧,常亮,等.基于B+樹的數(shù)據(jù)索引存儲[J].吉林大學(xué)學(xué)報:理學(xué)版,2013(11):1134-1137.
[4]王正霞,劉曉潔,梁剛.基于B+樹快速調(diào)優(yōu)的反饋式負載平衡算法[J].計算機應(yīng)用,2011,31(3):609-611.
[5]B-樹和B+樹的應(yīng)用:數(shù)據(jù)搜索和數(shù)據(jù)庫索引[EB/OL]. (2012-07-29)[2014-03-20].http://blog.csdn.net/ hguisu/article/details/7786014,2012-7-29.
[責(zé)任編輯:吳卓]
Tree Composite Control Design for MRP Development
YE Xiaoyan
(South China Institute of Software Engineering,Guangzhou University,Guangzhou Guangdong 510990,China)
There is a multilayer dependent relationship between the data in the MRP database,and in real application,not only the tree structure but also the details of the data need to be displayed.However,the existing control can not meet the requirement.In this paper,a self-defined Treegrid control was designed after the DataGrid View,blending the display styles of both the TreeView and DataGridView.And it is able to preprocess the incoming data and form a hierarchical structure.On this basis,the layered grid display of data is realized,and it is convenient for users to expand or contract the leveled data,and to do data adding or deleting operations.Meanwhile,the program developers can make full use of this function according to their demands,thus improving the development efficiency.
MRP;self-defined control;tree-structured control
TP311.11
A
1672-6138(2015)01-0005-06
10.3969/j.issn.1672-6138.2015.01.002
2014-11-26
葉小艷(1982—),女,湖南長沙人,碩士,講師,網(wǎng)絡(luò)工程師,研究方向:信息技術(shù)。