用于MRP开发的树表复合型控件的设计
2015-08-30叶小艳广州大学华软软件学院网络技术系广东广州510990
叶小艳(广州大学 华软软件学院网络技术系,广东 广州 510990)
科技与应用
用于MRP开发的树表复合型控件的设计
叶小艳
(广州大学 华软软件学院网络技术系,广东 广州 510990)
MRP数据库中的数据之间存在多层从属关系,实际应用中既要显示数据的树状结构,也要显示数据的细节,但现有控件对开发的支持度不够。设计一个继承自DataGridView的自定义控件─TreeGrid,融合了TreeView和DataGridView的显示风格,能对传入的数据进行预处理,形成分层结构,并在此基础上,实现数据的分层网格显示,方便用户直观地展开和收缩层级数据,进行数据的增删改查操作,也使程序开发者能够按需调用,提高开发效率。
MRP;自定义控件;树视图控件
MRP(Material Requirement Planning,物料需求计划)用于企业的库存和生产管理,它根据总生产进度计划中所规定的最终产品的交货日期,编制装配件、部件、零件的生产进度计划、对外的采购计划、对内的生产计划,从而计算物料需求量和需求时间,以降低物料库存量[1]。
MRP必须根据各层次物品的从属和数量关系,以每个物品为计划对象,以完工时期为时间基准倒排计划,按提前期长短区别各个物品下达计划时间的先后顺序,这些数据存放在数据库中,通过应用软件展示给用户[2]。显示时,一方面要用树状结构展示多层从属关系,另一方面需要对数据进行增加、删除、修改、查找等操作,并显示数据的详细内容[3]。
采用C#开发数据库系统时,通常用到TreeView控件和DataGridView控件。TreeView控件用来显示信息的分级树状视图,但只能显示一列数据;DataGridView控件可以直观地显示和编辑多行多列的表格数据,但又不能够反映树状结构,所以系统开发者在利用这两种控件的时候,常需要做一些额外的重复开发工作。根据MRP的应用层需求,设计一个自定义控件,名为TreeGrid,解决MRP中层次化数据的显示问题,让MRP系统程序开发者按需调用本控件,提高开发效率[4]。
1 TreeGrid控件样式和调用接口
1.1控件样式
TreeGrid控件样式如图1所示。其中:0、1、2、3、4等数字表示数据的层级,数项1、数项2等是数据表中的原始数据;“—”表示该项包含子项,“○”表示是最低层次的节点。控件可以展开和收缩,体现了树状数据的操作逻辑,也可以显示详细的数据项,体现了网格视图的显示逻辑。
图1 TreeGrid控件的外观样式
1.2调用接口
当开发者需要显示树状结构数据时,需调用TreeGrid控件的AddData()方法。AddData()方法有两个重载:一个是AddData(DataSet ds),另一个是AddData(DataTable dt)。实际上,AddData (DataSet ds)在内部调用AddData(DataTabe dt)。
2 控件的工作原理和实现方法
2.1数据预处理
数据表进入到内存后,依据数据之间的从属关系,给数据表加上一个整形字段用于显示数据的层级:以1表示第一层、以2表示第二层,以此类推。按照深度优先算法遍历所有数据并将数据重新排序,使其符合树状结构:两个1级数据之间的2级数据从属于上一个1级数据,两个2级数据之间的3级数据从属于前一个2级数据,以此类推(如图2所示)。
图2 数据层级与树结构的对应关系
2.2加载并显示数据
图3 TreeGrid显示树状结构数据的流程图
加载并显示树状结构数据流程如图3所示。
设置一个用于记录上一条数据层级的指针变量tempLV,以及用于保存某一层级最后出现的位置的泛型集合listLastLV。tempLV默认指向0的位置,listLastLV默认存在listLastLV[0] =0。curLV指针变量表示数据源中当前遍历到的数据的层级,控件规定数据源表示层级的数据在第一列中。控件会比较curLV和tempLV的值。
当curLV>tempLV时,表示该数据属于上一条数据,即tempLV所指的数据包含curLV所指的数据。tempLV所指的数据的相应层级列的值将记为“─”,表示可展开并已展开。
随着电力市场竞争加剧,电力营销的风险也会加剧,企业经营风险也会大幅提升。因此,为了企业的发展和未来,必须尽快建立并实施电力营销风险管理体制,以电力用户以及市场经济需求为导向,以提供优质高效的电力服务为手段,在最大化保障电力用户合法利益的同时尽可能的提升企业自身的经济效益,从而促使企业健康问题发展和提升社会服务形象。
之后,将curLV所指的行索引记入listLastLV中对应位置,如当指向索引为x、层数为y的数据,记listLastLV[y] =x。tempLV指针向下移,curLV指针指向下一条数据,重复进行比较。
当curLV=tempLV时,表示该数据和上一条数据属于同一层,tempLV所指的数据的相应层级列的值将记为“○”,表示不可展开。
当curLV<tempLV时,表示该数据不属于上一条数据,tempLV所指的数据的相应层级列的值将记为“○”,表示不可展开。
当curLV指向数据最后一行并完成操作时,由于数据源遍历完毕,tempLV并不能下移,所以要对最后一行数据直接进行处理。因为是最后一行数据,可以确定为不能展开,直接在相应层级记“○”。
2.3展开和收缩条目
展开子条目有两种选择:一种是展开到指定条目的下一级,另一种是把指定条目下的所有子条目展示出来。默认用鼠标点击“+”时展开到下一级,开发者可以通过设置控件的ExpandAll属性更改鼠标点击的操作。开发者也可以通过调用ExpandRow()和ExpandRowAll()来展开条目。
1)展开一层。
图4 展开条目一层程序流程
2)展开全部子条目。
当要展开某条目的全部子条目时,控件同样从该条目的下一条开始遍历。如果遍历中的条目的lv大于要展开的条目的lv,就说明遍历中的条目属于要展开的条目,令该条目可见。当遇到遍历中的条目lv不大于要展开的条目的lv,说明从这条开始不再属于要展开的条目,控件终止遍历。遍历完成或终止后展开完毕。如图5所示。
图5 展开全部子条目的流程
3)收缩条目功能。
当要收起某条目时,控件从该条目的下一条开始遍历。在令遍历中的条目不可见前,先判断该条目的lv是否不大于要展开的条目的lv,如是,说明从这条目开始不属于要收起的条目,终止遍历。设该条目不可见后,如果该条目是它所处层级的最后一个时,终止遍历。遍历完成或终止后收起完毕。如图6所示。
3 TreeGrid控件在MRP中的应用
本控件文件是TreeGrid.dll,当开发者需要应用此控件时,只需要在项目中添加此dll,然后在工具箱的选择项中添加dll后即可在工具箱中找到此控件,具体操作如下:
首先,在工具箱中点击鼠标右键,找到“选择项”。点击“选择项”后需要等待比较长的时间,之后会出现“选择工具箱项”窗口,点击“.NET Framework组件”选项卡里的“浏览”按钮,在文件选择器中找到并打开TreeGrid.dll文件。打开TreeGrid.dll后,“.NET Framework组件”选项卡内会自动勾选并指向TreeGrid,如图7所示。此时只要按“确定”,工具箱中就会添加该控件。
图6 收起条目流程
图7 被勾选的TreeGrid
其次,开发者已经可以从工具箱中拖放TreeGrid控件到程序界面布局了。但是要调用控件的方法,还需要向程序引用添加控件的引用,如图8。
图8 向程序添加引用
控件的命名空间是TreeGrid,要调用控件的公开方法,还需要使用完全限定名称,或者添加using。如图9。
最后,在向本控件添加数据时,可以根据需要选择调用的方法。当只需要满足一般的数据显示需求时,可以使用继承自DataGridView的DataSource属性添加数据;当需要显示BOM时,需要调用AddData()方法,如图10。
图9 需要添加using TreeGrid
图10 添加数据流程图
4 结束语
本控件适用于处理树状结构(即层次化结构)数据,只要数据库中的数据体现了从属关系,经过预处理,都可以在控件中展现出来[5]。对于开发者而言,直接引用此控件,可以实现相关应用的大部分功能,有效提高开发效率。本控件大多数操作需要使用函数来调用,并没有给出属性设计,有需要的控件开发者可以编写更多属性来代替函数调用,用以提升控件的易用性。
[1]黄尹国,吴曙光.生产库存管理新方法:MRP[M].北京:机械工业出版社,1987:1-2.
[2]物资需求计划[EB/OL].(2013-04-08)[2014-03-20]. http://wiki.mbalib.com/wiki//物资需求计划.
[3]耿庆田,狄婧,常亮,等.基于B+树的数据索引存储[J].吉林大学学报:理学版,2013(11):1134-1137.
[4]王正霞,刘晓洁,梁刚.基于B+树快速调优的反馈式负载平衡算法[J].计算机应用,2011,31(3):609-611.
[5]B-树和B+树的应用:数据搜索和数据库索引[EB/OL]. (2012-07-29)[2014-03-20].http://blog.csdn.net/ hguisu/article/details/7786014,2012-7-29.
[责任编辑:吴卓]
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—),女,湖南长沙人,硕士,讲师,网络工程师,研究方向:信息技术。