范例说明
效果如下:
这个一个具有相同列,而其中一个列具有父子关系的一个表格,在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值。