完全用户自定义数据处理的探讨2

通过上面这个窗口,我们就可以设计出一个合适的数据表,通过点击“生成”就可以在数据库中生成这个物理数据表。同时,这些数据也是我们数据字典中最重要的数据。我们可以把表名和字段名都按照一定的规则生成比如 CTAB001 表示表名 ,CFLD001 表示某个字段名,然后在数据字典里建立起他们和汉语表名字段名的对应关系,这样就生成了我们的数据字典。

这里面有一些难点大家要注意一下,其中一个是主键生成的问题,特别是在修改表的时候,最好先把主键删除了再重新生成。另外,修改表时比较麻烦,最好把生成的 SQL 语句调试一下,多试几次,找出修改的规律。

我想,经过多次调试修改,如果再完善一下的化,通过上面的方法可以完成大部分表的生成。

其次,对于程序设计界面,我们用的更多,不管是 pb,Delphi,vs.net 他们基本上都是以资源文件的形式,把你设计的界面记录下来,主要是记录各个控件的属性和他们实现的方法。我认为,这个工作我们完全可以模仿,可以作出自己的设计界面来,如图:

在这个窗体设计界面里,我们设计的是一个主从表的结构,主表字段对应在上面的几个控件里,从表对应中间的那个网格控件,而最下面的那个控件是最重要的控制器。属性设置也很简单,和通常开发工具里的属性设计器(对象观察器)基本一样,比如对于从表,我们只需要设置它的表名就可以了,别的一概不用设计(也不用管它有几个字段,也不用管数据类型)。

当然,因为是主从表,所以我们还要设计主从表之间的关系,可以通过关系控件来设置,下面是两个表控件和关系控件的属性设置界面:

然后,我们可以把这些界面设置保存到配置文件中去(如果需要也可以保存到数据库中),下面是生成的一段配置文件:

 1<struct>
 2<form>
 3<prop>
 4<type>CustomerForm.DesignForm</type>
 5<attr backcolor="-1250856" caption="  订货单录入窗口  " 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" text="  订货单录入窗口  \- [test.cfm]" top="0" width="557">
 6</attr>
 7</prop>
 8</form>
 9<controls>
10<control>
11<type>CustomerForm.CusLabel</type>
12<attr 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" text="  订单号  " top="10" width="51">
13</attr>
14</control>
15<control>
16<type>CustomerForm.CusTextBox</type>
17<attr backcolor="-1" dock="None" fieldinfo='&lt;?xml version="1.0" encoding="utf-16"?&gt;
18&lt;TableInfo xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&gt;
19  &lt;TableName&gt;  订单  .  订单号  &lt;/TableName&gt;
20  &lt;TableID&gt;CTab003.CF001&lt;/TableID&gt;
21&lt;/TableInfo&gt;' 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" tablelist='&lt;?xml version="1.0" encoding="utf-16"?&gt;
22&lt;TableInfo xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&gt;
23  &lt;TableName&gt;  订单  &lt;/TableName&gt;
24  &lt;TableID&gt;CTab003&lt;/TableID&gt;
25&lt;/TableInfo&gt;' text="" top="8" width="82">
26</attr>
27</control>
28
29当然,根据需要,你可以自定义任意格式的配置文件,我这里采用的是  XML  格式。 
30
31这里也有一些需要注意的地方,其中之一是设计界面中显示的设计控件。这些控件看起来和标准的控件没什么两样,但他们全都是我从  UserControl  继承过来的,然后自己绘制他们的外观,使他们和真正的控件看起来一样,但不会响应任何事件。其实,连最下面那一排六个按钮也是一个控件,也是从  usercontrol  继承过来的,只是在上面花了六个按钮的样子而已。 
32
33这些还不是问题的关键,关键问题是属性设置和保存问题,怎样设计这些属性的编辑样式,怎样组织存储这些属性,都是我们需要注重考虑的问题。一开始我打算使用  PropertyGrid  控件,但是它不适合企业人员使用,不好显示汉语属性名称,而且重新隐藏那些不想显示的控件属性本身也比较麻烦,最后还是决定自己写了一个,可以显示编辑最常用的十来种数据类型,基本上也就够了。 
34
35控件的托放、移动、改变大小等常用的功能都比较简单,就不介绍了。 
36
37在存储属性的时候,有一些自己定义的比较复杂的属性,可以通过序列化的形式转化为字符串再存储,如果想读这些控件属性,可以把字符串再反序列化为属性。 
38
39最后就是根据这些配置文件来生成输入界面的问题了。 
40
41生成输入界面比较好办,只需要解析配置文件,根据配置文件的信息生成对应的控件即可。但难点是这些控件的事件处理方法怎么办?控件怎样绑定?比如当我点击保存的时候系统怎样知道我要保存了,它又怎样知道我要保存什么东西? 
42
43这些东西深究起来确实比较“咬手”,好在我花了几个月时间开发出来一系列组件,可以很好的处理这些东西(其实只是使用了这套组件很少的一部分功能)。其实从大的方面来讲,这些问题也好解决。毕竟这些数据处理都是很模式化的一些东西,差别就在数据的字段数量和类型上不同,真正的业务逻辑差不了多少。我们可以写一些和具体数据表无关的方法,通过数据集本身来了解数据表的信息,比如主建信息,比如关系信息等。还比如,我们使用datagrid来表示从表数据时,就可以使用我们数据字典里的东西,可以很好的生成datagrid的输入界面,而不用考虑究竟有多少列,也不用考虑什么数据类型。当然,这个datagrid是增强的datagrid,本身就支持很多种功能。 
44
45当然,我很感激EntLib,它给我带来了很多便利,比如数据库存储这一块,使用它就比较容易实现数据的处理,经过进一步功能增强,可以通过一个方法来存储任何数据集,而不用关心数据集里有几个表,也不用关心表之间的关系,更不用关心表里有什么字段了。 
46
47在我们提供了这些和具体数据集无关的方法以后,就可以在生成数据处理界面时,把这些方法挂接到这些控件的事件上,然后系统就可以正常运行了。这里面也有一些关键点,其中数据从数据库取得到存储都是很关键的地方。 
48
49这些就是我的一点感想,今天就写到这里把,希望和大家一块探讨。</controls></struct>
Published At
Categories with Web编程
Tagged with
comments powered by Disqus