Dorado 5 : 3.绑定Dataset的递归树 (T1)

在数据树控件DataTree中,我们之前已经学习了使用Simple TreeLevel层对象绑定Dataset的方式实现动态创建树节点。使用Simple TreeLevel层对象在每层都绑定一个Dataset的方式,通过Dataset之间的主从关系设置完成树节点的层级关联。除此之外,DataTree中还提供了Recursive TreeLevel递归层对象的方式实现。
Recursive TreeLevel也是需要绑定一个Dataset对象,并且可以利用Dataset的数据延迟加载技术,递归产生树中的节点对象。递归层的树节点实际上也是一种树节点的父子关系,与Simple TreeLevel不同,递归层树节点的父子关系,是通过Recursive TreeLevel递归层的recursiveKeyFields和recursiveKeyParameters属性定义的。简单地说,就是通过自身循环的方式获取数据并动态创建树节点。

准备工作

在sample项目的src下新建ViewModel,命名recursiveTree。新建关联表CATEGORY的AutoSqlDataset,命名datasetCategory。

图14-40
再新建关联表PRODUCT的AutoSqlDataset,命名datasetProduct(只需要PRODUCT_ID、PRODUCT_NAME、CATEGORY_ID三列)。

图14-41
新建树控件DataTree,命名treeCategory。步骤:【Controls】—>【Insert】—>【Tree】—>【DataTree】。

图14-42

创建节点层对象

在树控件treeCategory下,新建递归层对象Recursive TreeLevel。步骤:【treeCategory】—>【Insert】—>【Recursive TreeLevel】。

图14-43
设置递归层的dataset属性值为datasetCategory,level属性值为levelCategory。

图14-44
点击【Finish】完成递归层对象的创建。

图14-45
然后,还需要在treeCategory节点下创建Simple TreeLevel节点层对象,绑定datasetProduct。

图14-46
点击【Finish】完成创建。

图14-47

配置数据集对象的查询匹配

本例中有两个数据集对象分别是datasetCategory和datasetProduct。其中绑定datasetCategory的节点层对象是Recursive TreeLevel,而绑定datasetProduct的节点层对象是Simple TreeLevel。
首先在datasetCategory中配置MatchRules对象。步骤:【datasetCategory】—>【Modify...】。

图14-48
设置PRANT_ID为查询参数。

图14-49
完成datasetCategory的MatchRules配置之后,在datasetCategory节点下新建Parameter对象。步骤:【datasetCategory】—>【Parameters】—>【Insert】—>【Parameter】。

图14-50
设置新建Parameter对象的name属性值为PARENT_ID,dataType属性值为string。

图14-51
在表CATEGORY的数据中属于顶层数据的PARENT_ID列值为NULL,因此在初始化datasetCategory并加载数据时,首先需要过滤查询出的数据为PARENT_ID的值是NULL的数据。设置Parameter对象PARENT_ID的值为$null。

图14-52
datasetCategory的配置完成后,再配置datasetProduct的MatchRules属性。

图14-53

配置节点层的属性

设置treeCategory节点下递归层对象levelCategory的相关递归属性。

图14-54
配置levelCategory层对象之下的levelProduct层对象属性。

图14-55
保存全部修改,新建recursiveTree的相关JSP页面recursive_tree.jsp,通过【Browse】查看效果。

图14-56

在树节点层中添加图标

树控件的层对象拥有加载节点图标的属性,可以配置相关属性加载默认图标或展开节点时的图标。
在treeCategory节点下的levelCategory层对象中,expendedIcon属性表示展开该层节点时的图标显示,而icon属性则是默认加载的图标,它们的属性值是需要显示图标的相对路径,本例中的图标文件位于sample\web\images文件夹中。

图14-57
然后配置levelProduct层对象的icon属性值,同样是图标所在的相对路径。另外,由于levelProduct层是最后一层,所以配置其hasChild属性值为false,表示该层之下并无子节点。

图14-58
保存全部修改,刷新页面查看效果。

图14-59
完成示例学习之后,我们来详细了解其中Recursive TreeLevel递归层对象和Simple TreeLevel普通层对象中的常用属性。

  1. masterKeyFields属性

用于配置与上层节点之间的关系。当该层树节点被展开时,自动从上层节点绑定的Record对象中获取masterKeyFields属性中指定字段的值。该属性可以配置为多个字段,中间用英文逗号","分隔。

  1. detailKeyParameters属性

用于配置与上层节点间的关系。当该层树节点被展开时,自动从上层节点绑定的Record对象中获取masterKeyFields属性中指定字段的值,并将此获得值作为当前树节点层绑定Dataset的Parameters参数对象存储起来。其中Parameter的参数名name就是detailKeyParameters属性指定,参数值value则是由masterKeyFields属性指定获取。该属性可以配置为多个字段,中间用英文逗号","分隔。

  1. recursiveKeyFields属性

递归层展开下一层时需要从当前层节点所绑定的Record对象中获取的指定字段的值,指定字段的name即是在此属性中配置。该属性可以配置为多个字段,中间用英文逗号","分隔。

  1. recursiveKeyParameters属性

递归层展开下一层时需要在其递归层对象绑定的Dataset中创建Parameter对象,用于过滤查询数据并动态生成下一层树节点。其中被创建的Parameter对象的参数名name由recursiveKeyParameters属性指定,参数值value则是由recursiveKeyFields属性指定获取。该属性可以配置为多个字段,中间用英文逗号","分隔。
下面以datasetCategory和datasetProduct为例,详细讲解Recursive TreeLevel和Simple TreeLevel的工作流程原理。

详细流程原理图

  1. 当datasetCategory第1次加载时,由于已经新建Parameter对象并设置参数值为$null,该参数值自动匹配设置的MatchRule实现数据的过滤查询(图中的①⑤)。因此递归层的第1层树节点初始化时被创建完成。
  2. 展开下一层节点时,第1层树节点绑定的Record对象中指定字段名的数据值被获取。其中指定字段名在recursiveKeyFields属性中指定(图中的②)。
  3. 展开同时,datasetCategory中的PARENT_ID参数对象被赋值用于匹配MatchRules执行过滤查询。其中,recursiveKeyParameters属性指定在datasetCategory中的参数对象名name(图中的④),而参数值则是由recursiveKeyFields属性指定获得(图中的③)。(参数对象若存在则直接赋值,不存在则创建)
  4. datasetCategory中的参数对象被赋值之后,自动匹配已经设置的MatchRule过滤条件(图中的⑤),实现datasetCategory的过滤条件查询,其查询结果加载到datasetCategory中并最终动态创建其绑定层的树节点。
  5. 一直展开下一层节点直到属于Simple TreeLevel绑定datasetProduct生成的树节点层。当最后一层被展开时,自动从上层节点绑定的Record对象中获取指定字段名的数据值value。其中指定字段名是由masterKeyFields属性配置(图中的⑥)。
  6. 展开同时,datasetProduct需要被创建Parameter参数对象用于匹配其中设置的MatchRules执行过滤查询。其中detailKeyParameters属性指定Parameter参数对象的参数名name(图中的⑧),参数值value则是由masterKeyFields属性指定获得(图中的⑦)。
  7. datasetProduct的参数对象被赋值后,自动匹配已经设置的MatchRule过滤条件(图中的⑨),实现datasetProduct的过滤条件查询,其查询结果加载到datasetProduct并最终动态创建其绑定层的树节点。

开发步骤

本例中采用递归层对象和普通层对象结合展现,利用不同类型的层对象的属性实现动态创建不同层的树节点。

开发步骤

 


第一步:准备工作。


第二步:新建递归层并绑定Dataset。


第三步:在递归层下新建普通层并绑定Dataset。


第四步:分别配置两个Dataset的MatchRules和Parameter。


第五步:配置递归层对象的属性。


第六步:配置普通层对象的属性。


详细步骤图

 


Attachments:

worddav6b76d5bf9d6130ffea6ef773852aa01b.png (image/png)
worddav988dae9664305a570e6bdb0c1a92ddbe.png (image/png)
worddavdf133562cd287bd3285b6f28aa6b76d8.png (image/png)
worddav8673919d48360a5296b157f505529f29.png (image/png)
worddav11d7ff869bd027ae973d2aa52eb0c0ce.png (image/png)
worddavd6eb32ffe5a40e3da24dd5d7f7af0788.png (image/png)
worddavcfbeb05dd52cb97c28c87a8c2bc7abaa.png (image/png)
worddavd3b2f8dff892564f74a01d51e7be9287.png (image/png)
worddav0cc900ddb4361959586734bea1372df9.png (image/png)
worddav2dc9e4e80e5a8f0e65fd4949004e7cb8.png (image/png)
worddav206cf2ffb1706fde9b81aca8053c3efd.png (image/png)
worddavffd9d594db09103ea6a65c10f9e19c71.png (image/png)
worddav35913cb19d78affc6ea46d9d7a7aed44.png (image/png)
worddav548f5057676dec72fc10f23667bccf58.png (image/png)
worddav91aa83223b2a2a14e16a5c8bf6198e26.png (image/png)
worddav0b6affe2a1fc9b2da81007dd9b7ba086.png (image/png)
worddav14a6027082f3c95b95501bd1a0f2c468.png (image/png)
worddav592ed558d785b756a9c083f09e3053fe.png (image/png)
worddav651c916fee7fd33184adb5cf51f109ad.png (image/png)
worddavde6014c664e34b7ef2db3199888607c2.png (image/png)
worddav4dbf2073731dfaf89d377daafe8d7c2b.png (image/png)
worddav53b7257e985d9da22464adff54b5b48d.png (image/png)
worddav130cd842590bc8ac05b653588ae304af.png (image/png)
worddav70cc0f033473d8f0f82b994c1433087c.png (image/png)
worddavac3fe7fe1b71b444e0a777241b58009b.png (image/png)
worddavf1e626ab8f2f570063fa9686ffeddae0.png (image/png)
worddav92482ca3327d48c88b1685b82bd16892.png (image/png)
worddavccd917684435479dc550223e64e975f4.png (image/png)