葉小艷(廣州大學(xué) 華軟軟件學(xué)院網(wǎng)絡(luò)技術(shù)系,廣東 廣州 510990)
科技與應(yīng)用
用于MRP開發(fā)的樹表復(fù)合型控件的設(shè)計(jì)
葉小艷
(廣州大學(xué) 華軟軟件學(xué)院網(wǎng)絡(luò)技術(shù)系,廣東 廣州 510990)
MRP數(shù)據(jù)庫中的數(shù)據(jù)之間存在多層從屬關(guān)系,實(shí)際應(yīng)用中既要顯示數(shù)據(jù)的樹狀結(jié)構(gòu),也要顯示數(shù)據(jù)的細(xì)節(jié),但現(xiàn)有控件對(duì)開發(fā)的支持度不夠。設(shè)計(jì)一個(gè)繼承自DataGridView的自定義控件─TreeGrid,融合了TreeView和DataGridView的顯示風(fēng)格,能對(duì)傳入的數(shù)據(jù)進(jìn)行預(yù)處理,形成分層結(jié)構(gòu),并在此基礎(chǔ)上,實(shí)現(xiàn)數(shù)據(jù)的分層網(wǎng)格顯示,方便用戶直觀地展開和收縮層級(jí)數(shù)據(jù),進(jìn)行數(shù)據(jù)的增刪改查操作,也使程序開發(fā)者能夠按需調(diào)用,提高開發(fā)效率。
MRP;自定義控件;樹視圖控件
MRP(Material Requirement Planning,物料需求計(jì)劃)用于企業(yè)的庫存和生產(chǎn)管理,它根據(jù)總生產(chǎn)進(jìn)度計(jì)劃中所規(guī)定的最終產(chǎn)品的交貨日期,編制裝配件、部件、零件的生產(chǎn)進(jìn)度計(jì)劃、對(duì)外的采購計(jì)劃、對(duì)內(nèi)的生產(chǎn)計(jì)劃,從而計(jì)算物料需求量和需求時(shí)間,以降低物料庫存量[1]。
MRP必須根據(jù)各層次物品的從屬和數(shù)量關(guān)系,以每個(gè)物品為計(jì)劃對(duì)象,以完工時(shí)期為時(shí)間基準(zhǔn)倒排計(jì)劃,按提前期長(zhǎng)短區(qū)別各個(gè)物品下達(dá)計(jì)劃時(shí)間的先后順序,這些數(shù)據(jù)存放在數(shù)據(jù)庫中,通過應(yīng)用軟件展示給用戶[2]。顯示時(shí),一方面要用樹狀結(jié)構(gòu)展示多層從屬關(guān)系,另一方面需要對(duì)數(shù)據(jù)進(jìn)行增加、刪除、修改、查找等操作,并顯示數(shù)據(jù)的詳細(xì)內(nèi)容[3]。
采用C#開發(fā)數(shù)據(jù)庫系統(tǒng)時(shí),通常用到TreeView控件和DataGridView控件。TreeView控件用來顯示信息的分級(jí)樹狀視圖,但只能顯示一列數(shù)據(jù);DataGridView控件可以直觀地顯示和編輯多行多列的表格數(shù)據(jù),但又不能夠反映樹狀結(jié)構(gòu),所以系統(tǒng)開發(fā)者在利用這兩種控件的時(shí)候,常需要做一些額外的重復(fù)開發(fā)工作。根據(jù)MRP的應(yīng)用層需求,設(shè)計(jì)一個(gè)自定義控件,名為TreeGrid,解決MRP中層次化數(shù)據(jù)的顯示問題,讓MRP系統(tǒng)程序開發(fā)者按需調(diào)用本控件,提高開發(fā)效率[4]。
1.1控件樣式
TreeGrid控件樣式如圖1所示。其中:0、1、2、3、4等數(shù)字表示數(shù)據(jù)的層級(jí),數(shù)項(xiàng)1、數(shù)項(xiàng)2等是數(shù)據(jù)表中的原始數(shù)據(jù);“—”表示該項(xiàng)包含子項(xiàng),“○”表示是最低層次的節(jié)點(diǎn)。控件可以展開和收縮,體現(xiàn)了樹狀數(shù)據(jù)的操作邏輯,也可以顯示詳細(xì)的數(shù)據(jù)項(xiàng),體現(xiàn)了網(wǎng)格視圖的顯示邏輯。
圖1 TreeGrid控件的外觀樣式
1.2調(diào)用接口
當(dāng)開發(fā)者需要顯示樹狀結(jié)構(gòu)數(shù)據(jù)時(shí),需調(diào)用TreeGrid控件的AddData()方法。AddData()方法有兩個(gè)重載:一個(gè)是AddData(DataSet ds),另一個(gè)是AddData(DataTable dt)。實(shí)際上,AddData (DataSet ds)在內(nèi)部調(diào)用AddData(DataTabe dt)。
2.1數(shù)據(jù)預(yù)處理
數(shù)據(jù)表進(jìn)入到內(nèi)存后,依據(jù)數(shù)據(jù)之間的從屬關(guān)系,給數(shù)據(jù)表加上一個(gè)整形字段用于顯示數(shù)據(jù)的層級(jí):以1表示第一層、以2表示第二層,以此類推。按照深度優(yōu)先算法遍歷所有數(shù)據(jù)并將數(shù)據(jù)重新排序,使其符合樹狀結(jié)構(gòu):兩個(gè)1級(jí)數(shù)據(jù)之間的2級(jí)數(shù)據(jù)從屬于上一個(gè)1級(jí)數(shù)據(jù),兩個(gè)2級(jí)數(shù)據(jù)之間的3級(jí)數(shù)據(jù)從屬于前一個(gè)2級(jí)數(shù)據(jù),以此類推(如圖2所示)。
圖2 數(shù)據(jù)層級(jí)與樹結(jié)構(gòu)的對(duì)應(yīng)關(guān)系
2.2加載并顯示數(shù)據(jù)
圖3 TreeGrid顯示樹狀結(jié)構(gòu)數(shù)據(jù)的流程圖
加載并顯示樹狀結(jié)構(gòu)數(shù)據(jù)流程如圖3所示。
設(shè)置一個(gè)用于記錄上一條數(shù)據(jù)層級(jí)的指針變量tempLV,以及用于保存某一層級(jí)最后出現(xiàn)的位置的泛型集合listLastLV。tempLV默認(rèn)指向0的位置,listLastLV默認(rèn)存在listLastLV[0] =0。curLV指針變量表示數(shù)據(jù)源中當(dāng)前遍歷到的數(shù)據(jù)的層級(jí),控件規(guī)定數(shù)據(jù)源表示層級(jí)的數(shù)據(jù)在第一列中??丶?huì)比較curLV和tempLV的值。
當(dāng)curLV>tempLV時(shí),表示該數(shù)據(jù)屬于上一條數(shù)據(jù),即tempLV所指的數(shù)據(jù)包含curLV所指的數(shù)據(jù)。tempLV所指的數(shù)據(jù)的相應(yīng)層級(jí)列的值將記為“─”,表示可展開并已展開。
隨著電力市場(chǎng)競(jìng)爭(zhēng)加劇,電力營(yíng)銷的風(fēng)險(xiǎn)也會(huì)加劇,企業(yè)經(jīng)營(yíng)風(fēng)險(xiǎn)也會(huì)大幅提升。因此,為了企業(yè)的發(fā)展和未來,必須盡快建立并實(shí)施電力營(yíng)銷風(fēng)險(xiǎn)管理體制,以電力用戶以及市場(chǎng)經(jīng)濟(jì)需求為導(dǎo)向,以提供優(yōu)質(zhì)高效的電力服務(wù)為手段,在最大化保障電力用戶合法利益的同時(shí)盡可能的提升企業(yè)自身的經(jīng)濟(jì)效益,從而促使企業(yè)健康問題發(fā)展和提升社會(huì)服務(wù)形象。
之后,將curLV所指的行索引記入listLastLV中對(duì)應(yīng)位置,如當(dāng)指向索引為x、層數(shù)為y的數(shù)據(jù),記listLastLV[y] =x。tempLV指針向下移,curLV指針指向下一條數(shù)據(jù),重復(fù)進(jìn)行比較。
當(dāng)curLV=tempLV時(shí),表示該數(shù)據(jù)和上一條數(shù)據(jù)屬于同一層,tempLV所指的數(shù)據(jù)的相應(yīng)層級(jí)列的值將記為“○”,表示不可展開。
當(dāng)curLV<tempLV時(shí),表示該數(shù)據(jù)不屬于上一條數(shù)據(jù),tempLV所指的數(shù)據(jù)的相應(yīng)層級(jí)列的值將記為“○”,表示不可展開。
當(dāng)curLV指向數(shù)據(jù)最后一行并完成操作時(shí),由于數(shù)據(jù)源遍歷完畢,tempLV并不能下移,所以要對(duì)最后一行數(shù)據(jù)直接進(jìn)行處理。因?yàn)槭亲詈笠恍袛?shù)據(jù),可以確定為不能展開,直接在相應(yīng)層級(jí)記“○”。
2.3展開和收縮條目
展開子條目有兩種選擇:一種是展開到指定條目的下一級(jí),另一種是把指定條目下的所有子條目展示出來。默認(rèn)用鼠標(biāo)點(diǎn)擊“+”時(shí)展開到下一級(jí),開發(fā)者可以通過設(shè)置控件的ExpandAll屬性更改鼠標(biāo)點(diǎn)擊的操作。開發(fā)者也可以通過調(diào)用ExpandRow()和ExpandRowAll()來展開條目。
1)展開一層。
圖4 展開條目一層程序流程
2)展開全部子條目。
當(dāng)要展開某條目的全部子條目時(shí),控件同樣從該條目的下一條開始遍歷。如果遍歷中的條目的lv大于要展開的條目的lv,就說明遍歷中的條目屬于要展開的條目,令該條目可見。當(dāng)遇到遍歷中的條目lv不大于要展開的條目的lv,說明從這條開始不再屬于要展開的條目,控件終止遍歷。遍歷完成或終止后展開完畢。如圖5所示。
圖5 展開全部子條目的流程
3)收縮條目功能。
當(dāng)要收起某條目時(shí),控件從該條目的下一條開始遍歷。在令遍歷中的條目不可見前,先判斷該條目的lv是否不大于要展開的條目的lv,如是,說明從這條目開始不屬于要收起的條目,終止遍歷。設(shè)該條目不可見后,如果該條目是它所處層級(jí)的最后一個(gè)時(shí),終止遍歷。遍歷完成或終止后收起完畢。如圖6所示。
本控件文件是TreeGrid.dll,當(dāng)開發(fā)者需要應(yīng)用此控件時(shí),只需要在項(xiàng)目中添加此dll,然后在工具箱的選擇項(xiàng)中添加dll后即可在工具箱中找到此控件,具體操作如下:
首先,在工具箱中點(diǎn)擊鼠標(biāo)右鍵,找到“選擇項(xiàng)”。點(diǎn)擊“選擇項(xiàng)”后需要等待比較長(zhǎng)的時(shí)間,之后會(huì)出現(xiàn)“選擇工具箱項(xiàng)”窗口,點(diǎn)擊“.NET Framework組件”選項(xiàng)卡里的“瀏覽”按鈕,在文件選擇器中找到并打開TreeGrid.dll文件。打開TreeGrid.dll后,“.NET Framework組件”選項(xiàng)卡內(nèi)會(huì)自動(dòng)勾選并指向TreeGrid,如圖7所示。此時(shí)只要按“確定”,工具箱中就會(huì)添加該控件。
圖6 收起條目流程
圖7 被勾選的TreeGrid
其次,開發(fā)者已經(jīng)可以從工具箱中拖放TreeGrid控件到程序界面布局了。但是要調(diào)用控件的方法,還需要向程序引用添加控件的引用,如圖8。
圖8 向程序添加引用
控件的命名空間是TreeGrid,要調(diào)用控件的公開方法,還需要使用完全限定名稱,或者添加using。如圖9。
最后,在向本控件添加數(shù)據(jù)時(shí),可以根據(jù)需要選擇調(diào)用的方法。當(dāng)只需要滿足一般的數(shù)據(jù)顯示需求時(shí),可以使用繼承自DataGridView的DataSource屬性添加數(shù)據(jù);當(dāng)需要顯示BOM時(shí),需要調(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]。對(duì)于開發(fā)者而言,直接引用此控件,可以實(shí)現(xiàn)相關(guān)應(yīng)用的大部分功能,有效提高開發(fā)效率。本控件大多數(shù)操作需要使用函數(shù)來調(diào)用,并沒有給出屬性設(shè)計(jì),有需要的控件開發(fā)者可以編寫更多屬性來代替函數(shù)調(diào)用,用以提升控件的易用性。
[1]黃尹國,吳曙光.生產(chǎn)庫存管理新方法:MRP[M].北京:機(jī)械工業(yè)出版社,1987:1-2.
[2]物資需求計(jì)劃[EB/OL].(2013-04-08)[2014-03-20]. http://wiki.mbalib.com/wiki//物資需求計(jì)劃.
[3]耿慶田,狄婧,常亮,等.基于B+樹的數(shù)據(jù)索引存儲(chǔ)[J].吉林大學(xué)學(xué)報(bào):理學(xué)版,2013(11):1134-1137.
[4]王正霞,劉曉潔,梁剛.基于B+樹快速調(diào)優(yōu)的反饋式負(fù)載平衡算法[J].計(jì)算機(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—),女,湖南長(zhǎng)沙人,碩士,講師,網(wǎng)絡(luò)工程師,研究方向:信息技術(shù)。