起步软件技术论坛
搜索
 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 5055|回复: 7

[分享]常见问题解决-树的拖拽(可以保存持久化,包括后台实现)

[复制链接]

10

主题

897

帖子

1909

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1909
QQ
发表于 2011-1-14 14:16:39 | 显示全部楼层
当把子结点移到虚根结点时报错;
这个错误 自己修复一下就好了。
移动节点会造成当前节点的的子节点全路径要在保存的时候利用数据库重新计算(不能再ui中算,因为不是所有的数据都已经取出来了),然后你再移动已经移动过的父下面的子节点,那么根据ui得到的信息就是不对的了,这个问题暂时不提供那么复杂的实现。
qq上找我时候,不要问我在不,直接发问题,我看到后会去论坛回复你的帖子。

10

主题

897

帖子

1909

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1909
QQ
 楼主| 发表于 2011-1-6 11:39:15 | 显示全部楼层
好的 我修改一下
qq上找我时候,不要问我在不,直接发问题,我看到后会去论坛回复你的帖子。

10

主题

897

帖子

1909

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1909
QQ
 楼主| 发表于 2011-1-6 11:47:44 | 显示全部楼层
[PHP]
var mainActivity = {};

mainActivity.dataMainAfterNew = function(event){
        mainActivity.generateFid(event);
};
mainActivity.grdMainAfterRowDrag = function(event){
        var treeData= event.instance;
        treeData.setValue('fParentId',event.targetRowId,event.srcRowId);
        mainActivity.generateFid(event);
};
/**
* @autho 007slm
* @desc 用来生成当前节点的全路径id的函数
*/
mainActivity.generateFid=function(event){
        /**
         * 如果是拖拽的情况
         */
        if(event.srcParentRowId){
                debugger;
                var treeData= event.instance;
               
                treeData.setValue('fIsLeafNode','',event.targetRowId);
                if(treeData.getValue('fIsLeafNode',event.srcParentRowId)==''){
                        /**
                         * 拖拽的时候如果移动的节点的父节点已经没有子节点,那么修改这个父节点的状态时叶子节点
                         */
                        if(treeData.store.hasChildren(event.srcParentRowId)==0){
                                treeData.setValue('fIsLeafNode','nkLeaf',event.srcParentRowId);
                        }
                }
               
                var fParentFID=treeData.getValue('fFID',event.instance.getValue('fParentId',event.srcRowId));
               
                var fParentLevel=treeData.getValue('fLevel',event.instance.getValue('fParentId',event.srcRowId));
               
                /**
                 * 拖拽的节点依照父节点的level重新计算自己的level
                 */
                if(parseInt(fParentLevel)){
                        var fLevelValue=parseInt(fParentLevel)+1;
                }
               
                var fFID=fParentFID+"/"+event.srcRowId;
               
                treeData.setValue('fFID',fFID,event.srcRowId);
                treeData.setValue('fLevel',fLevelValue,event.srcRowId);
                /**
                 * 如果是新增的情况
                 */       
        }
        else if(event.id){
                var treeData= event.instance;
                var fParentFID=treeData.getValue('fFID',event.instance.getValue('fParentId',event.id));
                var fFID=fParentFID+"/"+event.id;
                treeData.setValue('fFID',fFID,event.id);
        }
};

[/PHP]
java部分
[PHP]
public static void dragableProcessBeforeSaveDE_TreeAction() {
                /**
                 * 获取要保存的table对象
                 */
                Table table =(Table)ContextHelper.getActionContext().getParameter("table");
                String dataModel =(String)ContextHelper.getActionContext().getParameter("dataModel");
                for(Iterator<Row> it =table.iterator(ModifyState.EDIT);it.hasNext();){
                        /**
                         * 遍历table中已经修改的行,找到因为父id修改的行
                         */
                        Row row =it.next();
                        boolean modefied = row.isModified("fParentId");
                        if(modefied){
                               
                               
                                String newfFId =(String)row.getValue("fFID");
                                String oldfFId =(String)row.getOldValue("fFID");
                               
                                String  DE_Tree=(String)row.getValue("DE_Tree");
                               
                                String  oldLevel=(String)row.getOldValue("fLevel");
                                String  newLevel=(String)row.getValue("fLevel");
                                int diff=Integer.parseInt(newLevel)-Integer.parseInt(oldLevel);
                               
                                /**
                                 * 更行因为拖拽造成的全路径id和level的变动,包括拖拽的子节点的变动
                                 */
                                String updateFid="UPDATE DE_Tree DE_Tree set DE_Tree.fFID = REPLACE(DE_Tree.fFID,'"+oldfFId+"','"+newfFId+"') WHERE DE_Tree.fFID like '%/"+DE_Tree+"/%'";
                                String updateLevel="UPDATE DE_Tree DE_Tree set DE_Tree.fLevel = DE_Tree.fLevel + "+diff+" WHERE DE_Tree.fFID like '%/"+DE_Tree+"/%'";
                               
                                if (logger.isInfoEnabled()){
                                        logger.info("准备执行的语句是 updateFid:" +  updateFid+"\nupdateLevel:"+updateLevel);
                                }
                               
                                KSQL.executeUpdate(updateFid, null, dataModel, null);
                                KSQL.executeUpdate(updateLevel, null, dataModel, null);
                               
                        }
                }
        }
[/PHP]

tree.zip

22.82 KB, 下载次数: 839

10

主题

897

帖子

1909

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1909
QQ
 楼主| 发表于 2011-1-5 13:47:03 | 显示全部楼层 |阅读模式
平台树的默认是可以在gridTree上实现节点的拖拽的,但是拖拽后没有保存能力,同时节点类型和全路径id以及level都没有维护,本例子实现了拖拽的前端js维护fid(全路径id),level,nodetype(是否是叶子节点),以及保存的action之前批量修改拖拽造成的全路径变动和level的变动(利用ksql实现)。

tree.zip

22.39 KB, 下载次数: 1010

30

主题

98

帖子

237

积分

中级会员

Rank: 3Rank: 3

积分
237
发表于 2011-1-14 17:49:42 | 显示全部楼层
哦,谢谢楼主!

30

主题

98

帖子

237

积分

中级会员

Rank: 3Rank: 3

积分
237
发表于 2011-1-14 13:24:50 | 显示全部楼层
有BUG,
当把子结点移到虚根结点时报错;
当多移几次有子结点的结点时,部分级别不对;

能不能改进一下啊?

30

主题

98

帖子

237

积分

中级会员

Rank: 3Rank: 3

积分
237
发表于 2011-1-6 10:06:00 | 显示全部楼层
能不加一下注释啊

30

主题

98

帖子

237

积分

中级会员

Rank: 3Rank: 3

积分
237
发表于 2011-1-5 17:23:18 | 显示全部楼层
刷新后没问题!
高级模式
B Color Image Link Quote Code Smilies

本版积分规则

小黑屋|手机版|X3技术论坛|Justep Inc.    

GMT+8, 2024-12-4 01:11 , Processed in 0.079270 second(s), 26 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表