总共分为两部分,数据层容器实体类设计(本次)、Form表单数据层管理(下次)。
1.UI数据缓冲层的必要性
对于UI层的数据管理,增加数据缓冲层非常有必要,起到数据池的作用,所有的UI层数据操作都是基于DataSetPool,里面包括若干DataTable。
不使用数据缓冲层,主要问题有以下几点:
多值条件下,每个Field的值维护比较困难。
对于外部程序接口处理界面层数据比较麻烦。
界面层数据的Redo和Undo处理基本不能实现。
界面层数据绑定比较困难,例如一个数据Map被多个UI层显示列引用的时候,遍历显示列比较消耗效率。
UI显示列的Get/SetValue与数据层耦合性太过紧密。
对于界面层显示数据的二次加工处理比较麻烦,比如分级数据中编号列的拆分和合并。
2.UI数据缓冲层的概要设计
主要分为UI层数据池的维护、数据缓冲集的设计。
2.1.UI层数据池的维护
Form类包括MainDataSetPool、CachedDataSetPool两个数据集池,前者是当前的数据集,后者是已经缓存的数据集。
Form类中控件的onblur事件用于同步Form数据集的数据,更新MainDataSetPool,并维护CachedDataSetPool,更新涉及两层:Form数据、数据集版本。
Form类需要提供数据集的实例化、转换、绑定,这些工作需要数据集提供相应的Api。
2.2.数据缓冲集的设计
粒度从粗到细大体上分为:DataSet、DataRelation、DataTable、DataRow、DataColumn
命名空间启用ESF.UI.Web.Data,用于管理ESF框架。
DataSet中包括若干DataTable、DataRelation,管理table和之间的关系。
DataRelation用于维护table直接的关系,是一个二元表达式。
DataTable维护数据的最小单元。
DataRow维护数据行。
DataColumn数据列的定义。
3.UI数据缓冲层的详细设计
3.1.DataColumn的设计
ESF.UI.Web.Data.DataColumn={
#region 成员变量
var _colName;
var _colType;
var _defVal;
var _table;
var _disCols=new Array();
#endregion
#region 方法
this.ctr(table,colName,colType,defVal);
this.getName();
this.getColType();
this.getDefVal();
this.setDefVal(val);
this.getTable();
this.addDisCol(colName);
this.getDisCols();
#endregion
}
3.2.DataRow的设计
ESF.UI.Web.Data.DataRow={
#region 成员变量
var _rowId;
var _rowData = new Object();
var _table;
#endregion
#region 方法
this.ctr(table,rowId);
this.getRowId();
this.getValue(colName);
this.setValue(colName,val);
this.getRowData();
this.dispose();
this.clone(rowId);
this.toXml(serializeType);
#endregion
}
3.3.DataTable的设计
ESF.UI.Web.Data.DataTable={
#region 成员变量
var _tableName;
var _columns = new Object();
var _dataSet;
var _dataRows = new Object();
var _rowIds = new Array();
var _currrentRowId = null;
var _version;
#endregion
#region 方法
this.ctr(tableName);
this.addColumn(col);
this.getColumns();
this.getColumn(colName);
this.removeColumn(colName);
this.createColumn(colName,colType,defVal);
this.addDataRow(dataRow);
this.getDataRow(rowId);
this.getDataRows();
this.removeDataRow(rowId);
this.createDataRow(rowId);
this.getDataSet();
this.setDataSet(ds);
this.rowCount();
this.rowClear();
this.contains(rowId);
this.getPreRowId(rowId);
this.getNextRowId(rowId);
this.getFirstRowId();
this.getLastRowId();
this.getRowIds();
this.getCurrentRowId();
this.setCurrentRowId(rowId);
this.getCurrentRow();
this.getDataValue(rowId,colName);
this.setDataValue(rowId,colName,val);
this.clone();
this.toXml();
this.getVersion();
#endregion
#region 事件
this.BeforeColumnChange=null;
this.AfterColumnChange=null;
this.BeforeRowChange=null;
this.AfterRowChange=null;
#endregion
}
3.4.DataRelation的设计
ESF.UI.Web.Data.DataRelation={
#region 成员变量
var _relationName;
var _parentCols;
var _childCols;
var _parentTable;
var _childTable;
#endregion
#region 方法
this.ctr(relationName,parentCols,childCols);
this.getName();
this.getParentTable();
this.getChildTable();
this.getParentCols();
this.getChildCols();
#endregion
}
3.5.DataSet的设计
ESF.UI.Web.Data.DataSet={
#region 成员变量
var _dataSetName;
var _dataRelationNames = new Array();
var _dataRelations = new Object();
var _dataTableNames = new Array();
var _dataTables = new Object();
#endregion
#region 方法
this.ctr(dataSetName);
this.getName();
this.getDataRelations();
this.getDataRelationsByTableName(tableName);
this.addDataRelation(dataRelation);
this.removeDataRelation(dataRelationName);
this.getDataTables();
this.getDataTableByName(tableName);
this.getDataTableByIndex(index);
this.addDataTable(dataTable);
this.removeDataTable(dataTableName);
#endregion
}