1.1. 动态表单的技术实现

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_EntityTypeConfigCDMS_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. 存在问题及改进

动态表单采用二维数据库表进行数据的存储,当数据量大或表单数据项多时,对性能会有一定的影响。动态表单具有局限性,适用于业务数据量小和动态多变的特点的业务系统,而当业务数据量大且表单结构稳定的情况下,建议采用固定表单的方式。

posted on 2011-05-03 11:36  陈高  阅读(1815)  评论(2编辑  收藏  举报