Dorado 9 : DataControl(DCUG)

简介

数据控件.

数据控件可与数据集(DataSet)进行绑定,用于控制或显示数据集中的数据。

主要用于跟DataSet中的数据实体(dorado.Entity)或数据实体的集合(dorado.EntityList)进行绑定。

属性说明

dataSet

用于设定要绑定的数据集

dataPath

数据路径,用于指定数据控件与数据集中的哪些数据节点进行关联。

DataPath概念详细说明参考:

DataControl根据自身特性dataPath所指向的数据结构分两种类型: 

显示一个集合类对象 

如:DataGrid, DataSetDropDown, DataTree, DataBlockView, DataPilot; 

对于集合类的数据绑定对象,其DataPath所指向的数据都必须是一个集合类型,而不能是一个独立的实体对象。 

假设我们现在有一组如下结构的Entit+EntityList数据,其中包含Department和Employee两种实体类型,其中Department支持递归嵌套。下面的说明和示例都将围绕这组数据展开。  

[
	{
		id: "D1",
		name: "XX部1",
		departments: [
			{
				id: "D11",
				name: "XX部2",
				employees: [
					{
						id: "0001",
						name: "John",
						sex: "male",
						salary: 5000
					},
					...
				]
			},
			...
		]
	},
	...
]

 则dataPath正确的配置实例有:

  • null(即空) - 相当于直接返回被查询的数据。表示顶层集合中所有的(不包含被删除的)Department。
  • * - 同上。
  • [#dirty] - 表示顶层集合中所有在客户端被改变过的(包含被删除的)Department。
  • #.employees - 表示顶层集合中当前Department中所有的Employee。
  • *.departments - 表示所有第二层的Department。
  • .departments - 同上。
  • departments(repeat) - 表示所有Department的集合。注意:示例数据的顶层是一个集合,而在正常情况下是不能利用表达式来获取集合属性的。除非当一个具有repeat或leaf特性的表达式片段被应用于顶层集合时。引擎允许这样的特例,在此种情况下引擎会暂时忽略表达式片段中的属性名。
  • .departments(R) - 表示除顶层Department外所有其它Department的集合。
  • .#departments(R) - 表示除顶层Department外所有其它各层中当前Department的集合。
  • #departments(R) - 表示各层当前Department的集合。
  • .employees(R) - 表示所有employees属性中的对象的集合,即所有的Employee对象。
  • .#employees(R) - 表示所有Department中的当前Employee,将以数组的形式返回这些Employee实体的集合。
  • .employees(R)[@.get("sex")=="male"] - 表示所有Department中的男性Employee,将以数组的形式返回这些Employee实体的集合。
  • .employees(R)[#dirty,@.get("sex")=="male"] - 表示所有Department中的状态为已修改的男性Employee,将以数组的形式返回这些Employee实体的集合。
  • .employees(R)[@.get("salary")>3500 && @.get("sex")=="male"] - 同上。
  • .employees(R)[@.get("salary")>3500, @.get("sex")=="male"] - 表示所有Department中的薪水高于3500的男性Employee,将以数组的形式返回这些Employee实体的集合。

在前面的DataPath中我们接触到了当前实体的概念,在DataPath中以“#”表示。与之对应的数据绑定控件在表现形式上也有所体现,如:产品名称为"Milestone"的行为DataGrid的当前行。 

 

DataBlockView中名称为"Sweetcakes"对应的块为当前块: 

 

DataTree中"数据表格"节点为当前节点: 

上面几个实例图中背景色为绿色的选择对象就是DataPath中的当前记录的概念。

有关当前记录的详细概念请参考:

显示单实体对象的一个属性

如:DataLabel, TextEditor, CheckBox, TextArea;

同上那个JSON对象的声明: 

假设我们现在有一组如下结构的Entit+EntityList数据,其中包含Department和Employee两种实体类型,其中Department支持递归嵌套。下面的说明和示例都将围绕这组数据展开。   

[
	{
		id: "D1",
		name: "XX部1",
		departments: [
			{
				id: "D11",
				name: "XX部2",
				employees: [
					{
						id: "0001",
						name: "John",
						sex: "male",
						salary: 5000
					},
					...
				]
			},
			...
		]
	},
	...
]

 则dataPath正确的配置实例有: 

  • # - 表示顶层集合中的当前Department。
  • [#current] - 同上。
  • #.#employees - 表示顶层集合中当前Department中的当前Employee。
  • #.#departments.#employees - 表示顶层集合中当前Department中的当前Employee。
  • #departments(leaf) - 表示最末端的当前Department。即通过不断的尝试获取当前Department中的当前Department,直到最末端那个Department。
  • #departments(L) - 同上。

该类对象除了需要设置dataSet和dataPath属性外,还需要设定property属性,用于与实体对象的具体属性绑定:

 

由于EntityList具有当前记录的概念,对应DataLabel, TextEditor, CheckBox, TextArea这种显示单实体对象的某个属性的控件而言,其dataPath还支持集合类型的返回结果,只要确保这个集合类是一个EntityList,并且有当前记录。上述控件就会自动的将对应EntityList的当前记录作为要显示的实体对象。

根据这个原理,如下的dataPath设置也是正确的: 

  • null(即空) - 相当于直接返回被查询的数据。表示顶层集合中所有的(不包含被删除的)Department。
  • * - 同上。
  • #.employees - 表示顶层集合中当前Department中所有的Employee。
  • *.departments - 表示所有第二层的Department。
  • .departments - 同上。

但是如下的dataPath设置却是不正确的:

dataPath原因
departments(repeat) - 表示所有Department的集合可能不止一个当前Department
[#dirty] - 表示顶层集合中所有在客户端被改变过的(包含被删除的)Department。可能没有当前Department
.departments(R) - 表示除顶层Department外所有其它Department的集合。可能不止一个当前Department
.#departments(R) - 表示除顶层Department外所有其它各层中当前Department的集合。都是当前Department
#departments(R) - 表示各层当前Department的集合都是当前Department
.employees(R) - 表示所有employees属性中的对象的集合,即所有的Employee对象可能不止一个当前Employee
.#employees(R) - 表示所有Department中的当前Employee,将以数组的形式返回这些Employee实体的集合。返回的是数组,不是EntityList
.employees(R)[@.get("sex")=="male"] - 表示所有Department中的男性Employee,将以数组的形式返回这些Employee实体的集合。返回的是数组,不是EntityList
.employees(R)[#dirty,@.get("sex")=="male"] - 表示所有Department中的状态为已修改的男性Employee,将以数组的形式返回这些Employee实体的集合。返回的是数组,不是EntityList
.employees(R)[@.get("salary")>3500 && @.get("sex")=="male"] - 同上返回的是数组,不是EntityList
.employees(R)[@.get("salary")>3500, @.get("sex")=="male"] - 表示所有Department中的薪水高于3500的男性Employee,将以数组的形式返回这些Employee实体的集合返回的是数组,不是EntityList