Dorado 9 : 树型列表(sample-center)

范例说明

效果如下:

这个一个具有相同列,而其中一个列具有父子关系的一个表格,在Sample-Center中有一个递归树的范例,学习本例前请先弄明白递归树的使用。

定义DataProvider

在com.bstek.dorado.sample.interceptor的EmployeeInterceptor类中:

@DataProvider
public Collection<Employee> getEmployeesBySuperior(Long parameter) {
	return employeeDao
			.find("from Employee where reportsTo.id=" + parameter);
}

利用"@DataProvider"声明本方法是一个DataProvider方法
方法内部代码是根据方法参数传入的值作为Employee对象的reportsTo的id进行查询,Employee与reportsTo可以形成一个父子关系,从而形成树结构的逻辑。

定义数据展现控件

<DataTreeGrid dataSet="dsEmployees" treeColumn="firstName" stretchColumnsMode="stretchableColumns">
	<BindingConfigs>
		<BindingConfig childrenProperty="underlings" labelProperty="firstName" recursive="true" />
	</BindingConfigs>
	<Columns>
		<DataColumn property="firstName" width="160" />
		<DataColumn property="lastName" />
		<DataColumn property="sex" />
		<DataColumn property="titleOfCourtesy" />
		<DataColumn property="birthDate" />
		<DataColumn property="city" />
	</Columns>
</DataTreeGrid>

与DataGrid的区别在于其中定义了BindingConfigs对象,该对象的childrenProperty绑定Grid所绑定的dsEmployees对象的underlings属性。我们再看dsEmployees的定义:

<DataSet id="dsEmployees" dataType="[EmployeeX]" dataProvider="employeeInterceptor#getEmployeesBySuperior" />

这个DataSet的dataProvider就对应为我们前面定义好的getEmployeesBySuperior方法,其dataType为在本视图模型内部定义的本地DataType:

<DataType name="EmployeeX" parent="Employee">
	<PropertyDef name="titleOfCourtesy" mapValues='${dorado.getDataProvider("employeeService#getTitlesOfCourtesy").getResult()}' />
	<Reference name="underlings" dataType="[EmployeeX]" dataProvider="employeeInterceptor#getEmployeesBySuperior"
		parameter="$${this.id}" submitable="false" />
</DataType>

此处我们忽略titleOfCourtesy的定义,直接看underlings的定义,其dataProvider为前面定义的getEmployeesBySuperior。这样当dsEmployees从java层获取数据时,其中每个数据对象的underlings属性又可以通过getEmployeesBySuperior方法获取其子数据集合。parameter采用的动态EL表达式的技术,便于传入当前数据对象的id值。

Attachments:

TreeGrid.png (image/png)
image2020-5-10 10:36:17.png (image/png)