根据tree绑定数据的上下级关系,实现无限制的分支等级[flex][arraycollection][tree]

本文介绍了一种从数据库中获取部门信息并根据上下级关系构建层级结构的方法。通过筛选和遍历部门记录,实现TREE视图的层级显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

从数据库调出来的数据是所有的部门的记录,但是部门间存在上下级关系,在数据库中有一个确定上下级关系的表(部门DEPARTNAME;上级编号SUPERDEPARTNUM;本部门编号DEPARTNUM),最终要在TREE中按上下级关系层级显示。

项目中需要这样一个功能实现,逻辑有点复杂,写得可能有点复杂,以后想到好的方法再改进。。。。。

实现步骤:

【start】

1.从数据库中调取部门的相关记录存入aryDeptSet

2.判断是否为最高级别的部门,如果不是,将该部门记录筛选出存入aryDeptSet2中,并将aryDeptSet中相关记录删除

3.对aryDeptSet2中的记录遍历(倒序遍历)

     (1)寻找该记录相关连的上下级部门中的最底层的部门保存到temp,并在aryDeptSet2中将该部门删除

     (2)在aryDeptSet2中寻找该部门的父级部门存入Arraycol,并将该部门存入Arraycol的children中构建上下级关系,

              最后将该父级部门在aryDeptSet2中删除。

      (3)将aryDeptSet2中其他同级节点也加到Arraycol的children中,并在aryDeptSet2中删除

      (4)继续寻找Arraycol的父级部门,循环(2)、(3)步操作,直到寻找到第二等级部门,

               将此时的Arraycol追加到aryDeptSet中对应的最高等级父节点的children下

【end】

      

var aryDeptSet :ArrayCollection = event.result.DEPT as ArrayCollection;
    var aryDuty :ArrayCollection = event.result.DUTY as ArrayCollection;
    var aryDeptSet2 :ArrayCollection = new ArrayCollection();    
    //1.先筛选出aryDeptSet二级及以后分枝    
    for(var i:Number=aryDeptSet.length-1; i >=0; i--)
    {
     var item:Object = aryDeptSet.getItemAt(i);
     if (item.SUPERDEPARTNUM>=0)
     {
      aryDeptSet.removeItemAt(i);
      aryDeptSet2.addItem(item);
     }
    }
    
    
    //2.根据aryDeptSet2保留的子分枝重构aryDeptSet
    for(var m:Number=aryDeptSet2.length-1; m >=0; m=aryDeptSet2.length-1)
    {
     //(1)step first://判断是否有上一级且上一级的SUPERDEPARTNUM不为-1,将其添加到tempArraycol
     var myLevel:Number=0;//save判断 的级数
     var Arraycol:ArrayCollection=new ArrayCollection();//save级数链中的父子关系的items
     var temp:ArrayCollection=new ArrayCollection();//中转站
     //检索具体某一项ITEM的上下级关系
     var deepth:Number=0;
     temp.addItem(aryDeptSet2.getItemAt(0));
     //检索到最后一级
     for(var op:Number=1;;)
     {
      op=1;
      for(var m1:Number=m;m1>=0;m1--)
      {
       if(aryDeptSet2.getItemAt(m1).SUPERDEPARTNUM== temp.getItemAt(0).DEPARTNUM)
       {
        temp.setItemAt(aryDeptSet2.getItemAt(m1),0);
        deepth++;
        break;
       }
       if (m1==0)
        op=0;
      }
      if(op==0)
       break;     
     }
     aryDeptSet2.removeItemAt(aryDeptSet2.getItemIndex(temp.getItemAt(0)));m--;
     //(2)构造一个整分枝
     for(var op2:Number=1;;)
     {
      op2=1;
      //<1>添加父节点
      for(var m3:Number=m;m3>=0;m3--)
      {
       if(aryDeptSet2.getItemAt(m3).DEPARTNUM== temp.getItemAt(0).SUPERDEPARTNUM)
       {
        Arraycol.addItem(aryDeptSet2.getItemAt(m3));
        Arraycol.getItemAt(0).children=new ArrayCollection([temp.getItemAt(0)]);
        aryDeptSet2.removeItemAt(m3);m--;
        op2=0;deepth--;
        break;
       }
      }      
      //<2>添加剩余节点同级
      for(var m2:Number=m;m2>=0;m2--)
      {
       if(Arraycol.length==0)
        break;
       if(aryDeptSet2.getItemAt(m2).SUPERDEPARTNUM== temp.getItemAt(0).SUPERDEPARTNUM && aryDeptSet2.getItemAt(m2).SUPERDEPARTNUM!= temp.getItemAt(0).DEPARTNUM)
       {
        Arraycol.getItemAt(0).children.addItem(aryDeptSet2.getItemAt(m2));
        aryDeptSet2.removeItemAt(m2);m--;   
       }              
      }
      if(Arraycol.length>0)
      {
       temp.setItemAt(Arraycol.getItemAt(0),0);         
      }
      Arraycol.removeAll();
      if(deepth<=0)
       break;      
     }
     //(3)加入该分枝
     for(var m4:Number=aryDeptSet.length-1;m4>=0;m4--)
     {
      if(aryDeptSet.getItemAt(m4).DEPARTNUM==temp.getItemAt(0).SUPERDEPARTNUM)
      {
       if(aryDeptSet.getItemAt(m4).children==null)
       {
        aryDeptSet.getItemAt(m4).children=new ArrayCollection([temp.getItemAt(0)]);
        break;
       }
       else
       {
        aryDeptSet.getItemAt(m4).children.addItem(temp.getItemAt(0));
        break;
       }
      }
     }
     //(4)清空temp
     temp.removeAll();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值