通过上面这个窗口,我们就可以设计出一个合适的数据表,通过点击“生成”就可以在数据库中生成这个物理数据表。同时,这些数据也是我们数据字典中最重要的数据。我们可以把表名和字段名都按照一定的规则生成比如CTAB001表示表名,CFLD001表示某个字段名,然后在数据字典里建立起他们和汉语表名字段名的对应关系,这样就生成了我们的数据字典。
这里面有一些难点大家要注意一下,其中一个是主键生成的问题,特别是在修改表的时候,最好先把主键删除了再重新生成。另外,修改表时比较麻烦,最好把生成的SQL语句调试一下,多试几次,找出修改的规律。
我想,经过多次调试修改,如果再完善一下的化,通过上面的方法可以完成大部分表的生成。
其次,对于程序设计界面,我们用的更多,不管是pb,Delphi,vs.net他们基本上都是以资源文件的形式,把你设计的界面记录下来,主要是记录各个控件的属性和他们实现的方法。我认为,这个工作我们完全可以模仿,可以作出自己的设计界面来,如图:
在这个窗体设计界面里,我们设计的是一个主从表的结构,主表字段对应在上面的几个控件里,从表对应中间的那个网格控件,而最下面的那个控件是最重要的控制器。属性设置也很简单,和通常开发工具里的属性设计器(对象观察器)基本一样,比如对于从表,我们只需要设置它的表名就可以了,别的一概不用设计(也不用管它有几个字段,也不用管数据类型)。
当然,因为是主从表,所以我们还要设计主从表之间的关系,可以通过关系控件来设置,下面是两个表控件和关系控件的属性设置界面:
然后,我们可以把这些界面设置保存到配置文件中去(如果需要也可以保存到数据库中),下面是生成的一段配置文件:
<?xml version="1.0"?>
<struct>
<form>
<prop>
<type>CustomerForm.DesignForm</type>
<attr Text="订货单录入窗口 - [test.cfm]" BackColor="-1250856" Dock="None" Font="Name=宋体,Bold=False,Height=14,Italic=False,Size=9,Strikeout=False,Underline=False,Unit=Point,GdiVerticalFont=False" ForeColor="-16777216" Height="431" Left="0" TabIndex="0" Top="0" Width="557" Caption="订货单录入窗口">
</attr>
</prop>
</form>
<controls>
<control>
<type>CustomerForm.CusLabel</type>
<attr Text="订单号" BackColor="-1250856" Dock="None" Font="Name=宋体,Bold=False,Height=14,Italic=False,Size=9,Strikeout=False,Underline=False,Unit=Point,GdiVerticalFont=False" ForeColor="-16777216" Height="20" Left="9" TabIndex="1" Top="10" Width="51">
</attr>
</control>
<control>
<type>CustomerForm.CusTextBox</type>
<attr Text="" BackColor="-1" Dock="None" Font="Name=宋体,Bold=False,Height=14,Italic=False,Size=9,Strikeout=False,Underline=False,Unit=Point,GdiVerticalFont=False" ForeColor="-16777216" Height="21" Left="66" TabIndex="2" Top="8" Width="82" TableList="<?xml version="1.0" encoding="utf-16"?>
<TableInfo xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <TableName>订单</TableName>
 <TableID>CTab003</TableID>
</TableInfo>" FieldInfo="<?xml version="1.0" encoding="utf-16"?>
<TableInfo xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <TableName>订单.订单号</TableName>
 <TableID>CTab003.CF001</TableID>
</TableInfo>">
</attr>
</control>
当然,根据需要,你可以自定义任意格式的配置文件,我这里采用的是XML格式。
这里也有一些需要注意的地方,其中之一是设计界面中显示的设计控件。这些控件看起来和标准的控件没什么两样,但他们全都是我从UserControl继承过来的,然后自己绘制他们的外观,使他们和真正的控件看起来一样,但不会响应任何事件。其实,连最下面那一排六个按钮也是一个控件,也是从usercontrol继承过来的,只是在上面花了六个按钮的样子而已。
这些还不是问题的关键,关键问题是属性设置和保存问题,怎样设计这些属性的编辑样式,怎样组织存储这些属性,都是我们需要注重考虑的问题。一开始我打算使用PropertyGrid控件,但是它不适合企业人员使用,不好显示汉语属性名称,而且重新隐藏那些不想显示的控件属性本身也比较麻烦,最后还是决定自己写了一个,可以显示编辑最常用的十来种数据类型,基本上也就够了。
控件的托放、移动、改变大小等常用的功能都比较简单,就不介绍了。
在存储属性的时候,有一些自己定义的比较复杂的属性,可以通过序列化的形式转化为字符串再存储,如果想读这些控件属性,可以把字符串再反序列化为属性。
最后就是根据这些配置文件来生成输入界面的问题了。
生成输入界面比较好办,只需要解析配置文件,根据配置文件的信息生成对应的控件即可。但难点是这些控件的事件处理方法怎么办?控件怎样绑定?比如当我点击保存的时候系统怎样知道我要保存了,它又怎样知道我要保存什么东西?
这些东西深究起来确实比较“咬手”,好在我花了几个月时间开发出来一系列组件,可以很好的处理这些东西(其实只是使用了这套组件很少的一部分功能)。其实从大的方面来讲,这些问题也好解决。毕竟这些数据处理都是很模式化的一些东西,差别就在数据的字段数量和类型上不同,真正的业务逻辑差不了多少。我们可以写一些和具体数据表无关的方法,通过数据集本身来了解数据表的信息,比如主建信息,比如关系信息等。还比如,我们使用datagrid来表示从表数据时,就可以使用我们数据字典里的东西,可以很好的生成datagrid的输入界面,而不用考虑究竟有多少列,也不用考虑什么数据类型。当然,这个datagrid是增强的datagrid,本身就支持很多种功能。
当然,我很感激EntLib,它给我带来了很多便利,比如数据库存储这一块,使用它就比较容易实现数据的处理,经过进一步功能增强,可以通过一个方法来存储任何数据集,而不用关心数据集里有几个表,也不用关心表之间的关系,更不用关心表里有什么字段了。
在我们提供了这些和具体数据集无关的方法以后,就可以在生成数据处理界面时,把这些方法挂接到这些控件的事件上,然后系统就可以正常运行了。这里面也有一些关键点,其中数据从数据库取得到存储都是很关键的地方。
这些就是我的一点感想,今天就写到这里把,希望和大家一块探讨。