1.1.1. 简介
表单在信息系统中有着是十分重要的地位,然而数量众多的表单和易变动性让开发人员感到疲惫。因此提出了动态表单来解决此问题。根据目前所采用技术、开发平台,并结合SilverLight 4的特点,实现了动态表单的功能。
1.1.2. 应用场景
动态表单可以在很多管理信息系统中得到应用。在系统中,项目范围信息的范围信息包括很多分项,每个分项都有对应的表单来填报和展示其相关信息。而这些表单中的信息项经常会发生变化,或增加或减少,因此可以采用动态表单的形式,来实现表单数据填报的功能。
1.1.3. 实施方案
(1). 首先是数据库结构的设计,数据库的设计将直接关系到其功能的实现。
a) 表单列配置表
将线路工程表单代码设为“612”,其中就是数据库对应字段“ET_ID”。”ET_Config” 和“ET_ConfigItem”用来表示该表单列信息的ID和名称。ET_ConfigType用来表示该列的类型,如:字符型、数字型、布尔型、下拉列表型等等。这样就可以规范填写表单的信息。
其中,“KeyWord”字段有着重要的作用,他是动态表单中列与实体类对应关系的关键。通过该字段的信息我们才能将表单中信息与其含义相对应。
b) 表单数据存储表
表单的数据信息将以二维表的形式进行储存。表单的列信息将作为“Y”方向,行标识(即“X”方向)将采用具有唯一性的Guid编码来实现。字段“o_Guid”作为行的唯一标识,字段“ET_ConfigID”作为列的唯一性标识。字段“ET_Value”存放的就是所对应的值。
在数据库设计方面,还有其他表辅助表如:CDMS_EntityTypeConfig、CDMS_EntityTypeConnection等数据库表,来辅助动态表单功能,使其功能更加的完善。在此不做详细介绍了。
(2). 程序的实现
动态的表单的关键就是对应关系的建立。在程序上,有用反射类方法进行实现的,有通过制定表单规则进行辨别实现的。下面我将为大家呈现一下,我的实现过程。
if (dr["ET_ConfigType"].ToString() == "1") // 文本类型
{
GridViewDataColumn col = new GridViewDataColumn();
col.Header = dr["ET_ConfigItem"].ToString().Trim();
col.UniqueName = dr["KeyWord"].ToString();
col.Width = 100;
col.Footer = "string";
col.DataType = Type.GetType("string");
col.DataType = typeof(string);
col.DataMemberBinding = new Binding(string.Format("{0}", dr["KeyWord"].ToString()));
this.RadGridView1.Columns.Insert(i + 1, col);
}
else if (dr["ET_ConfigType"].ToString() == "5")//下拉列表
{
GridViewComboBoxColumn cboCM = new GridViewComboBoxColumn();
cboCM.Header = dr["ET_ConfigItem"].ToString().Trim();
cboCM.UniqueName = dr["KeyWord"].ToString();
cboCM.Width = 100;
cboCM.Footer = "ComboBox";
string comboxTypeID = dr["ComboxType"].ToString();
DataRow[] drNew = dt_EntityType.Select(string.Format(@"belongID = '{0}'",comboxTypeID));
List<CMBSoure> list = new List<CMBSoure>();
if (drNew.Length > 0)
{
for (int k = 0; k < drNew.Length; k++)
{
CMBSoure cmb = new CMBSoure();
cmb.CMBName = drNew[k]["TypeName"].ToString();
cmb.CMBValue = drNew[k]["TypeID"].ToString();
list.Add(cmb);
}
}
else
{
CMBSoure cmb = new CMBSoure();
cmb.CMBName = "暂无信息";
cmb.CMBValue = "暂无信息";
list.Add(cmb);
}
cboCM.DataMemberBinding = new Binding(dr["KeyWord"].ToString());
cboCM.SelectedValueMemberPath = "CMBValue";
cboCM.DisplayMemberPath = "CMBName";
cboCM.ItemsSource = list;
this.RadGridView1.Columns.Insert(i + 1, cboCM);
}
通过
col.UniqueName = dr["KeyWord"].ToString col.DataMemberBinding = new Binding(string.Format("{0}", dr["KeyWord"].ToString())
来实现对应关系的建立。而且我们还通过需要同的类型,来加载绑定列的相关信息。
1.1.4. 取得的成果应用动态表单技术,满足表单多变性的要求,具有较高的灵活性。动态表单可维护性好,可根据具体需求进行动态配置,可在很多管理信息系统中得到应用,减少重复开发工作。
具体实现效果可见工程项目管理系统工程范围信息维护页面,页面菜单路径:工程项目管理系统->项目范围管理->项目范围信息管理->工程范围信息维护。
1.1.5. 存在问题及改进
动态表单采用二维数据库表进行数据的存储,当数据量大或表单数据项多时,对性能会有一定的影响。动态表单具有局限性,适用于业务数据量小和动态多变的特点的业务系统,而当业务数据量大且表单结构稳定的情况下,建议采用固定表单的方式。