zoukankan      html  css  js  c++  java
  • 使用EasyUI中Tree

    easyui里面的加载tree的两种方式 
    
    
    
    
    第一种:
    
    使用EasyUI中Tree
    
    
    
    
    符合EasyUI中Tree的Json格式,我们先看一下,格式是如何的
    [{
        "id":1,
        "text":"My Documents",
        "children":[{
            "id":22,
            "text":"Photos",
            "state":"closed",
            "children":[{
                "id":111,
                "text":"Friend"
            },{
                "id":112,
                "text":"Wife"
            },{
                "id":113,
                "text":"Company"
            }]
        },{
            "id":12,
            "text":"Program Files",
            "children":[{
                "id":121,
                "text":"Intel"
            },{
                "id":122,
                "text":"Java",
                "attributes":{
                    "p1":"Custom Attribute1",
                    "p2":"Custom Attribute2"
                }
            },{
                "id":123,
                "text":"Microsoft Office"
            },{
                "id":124,
                "text":"Games",
                "checked":true
            }]
        },{
            "id":13,
            "text":"index.html"
        },{
            "id":14,
            "text":"about.html"
        },{
            "id":15,
            "text":"welcome.html"
        }]
    }]
    
    
     
    
    第一次看了之后,由于没有思路就给放弃了,就采取了Tree中的老大ZTree,可以问题接踵而至,它与前台的EasyUi有时会发生冲突,没办法最后还是只能采取EasyUi中Tree,仔细分析一下,貌似可以采用算法中的递归来实现,于是乎小编就有了以下的解决思路。
    
     
    
    1.先创建一个符合EasyUi中树形格式的类
    /*  树的节点类
           id:节点id,对载入远程数据很重要。
           text:显示在节点的文本。
           state:节点状态,'open' or 'closed',默认为'open'。当设置为'closed'时,拥有子节点的节点将会从远程站点载入它们。
           checked:表明节点是否被选择。
           children:子节点,必须用数组定义。
        */
        public class TreeNode
        {
            public string id { get; set; }  //节点的id值
            public string text { get; set; }  //节点显示的名称
            public string state { get; set; }//节点的状态
    
                  // 请在整个树转换成jsonString时,将字符串Checked换成checked,否则easyui不认
    
                  public bool Checked { get; set; } //注意:转成JsonTreeString时,将"Checked"替换成"checked",否则选中效果出不来的
            public List<TreeNode> children { get; set; }  //集合属性,可以保存子节点
        }
    
     
    
    2.把从后台查出来的对象,转换成为EasyUi中格式
    #region 2.0 将当前组织 对象 转成 树节点对象 +TreeNode ToNode()
            /// <summary>
            /// 将当前组织 对象 转成 树节点对象
            /// </summary>
            /// <returns></returns>
            public TreeNode ToNode()
            {
                TreeNode node = new TreeNode()
                {
                    id = this.pid,
                    text = this.OrganizationName,
                    state = "open",
                    Checked = false,           
                    children = new List<TreeNode>()
                };
                return node;
            }
            #endregion
    
    
    3.第三步通过递归转换好的树形节点,来找到自己的子节点,然后放到自己默认的属性中
      #region 2.0 将 组织集合 转成 树节点集合 +List<MODEL.EasyUIModel.TreeNode> ToTreeNodes(List<Ou_Permission> listPer)
            /// <summary>
            /// 将 组织集合 转成 树节点集合
            /// </summary>
            /// <param name="listPer"></param>
            /// <returns></returns>
            public static List<TreeNode> ToTreeNodes(List<Organization> listPer)
            {
                List<TreeNode> listNodes = new List<TreeNode>();
                //生成 树节点时,根据 pid=0的根节点 来生成
                LoadTreeNode(listPer, listNodes, "0");
    
    
            //if (listCurrentPermissions.Count > 0)
            //listNodes[0].Checked = false;
    
            SetFathersUnchecked(listNodes, argPId);
                return listNodes;
            }
            #endregion
    
            #region 3.0 递归组织集合 创建 树节点集合
            /// <summary>
            /// 递归组织集合 创建 树节点集合
            /// </summary>
            /// <param name="listPer">组织集合</param>
            /// <param name="listNodes">节点集合</param>
            /// <param name="pid">节点父id</param>
            public static void LoadTreeNode(List<Organization> listPer, List<TreeNode> listNodes, string pid)
            {
                foreach (var permission in listPer)
                {
                    //如果组织父id=参数
                    if (permission.pParent == pid)
                    {
                        //将 组织转成 树节点
                        TreeNode node = permission.ToNode();
                        //将节点 加入到 树节点集合
                        listNodes.Add(node);
                        //递归 为这个新创建的 树节点找 子节点
                        LoadTreeNode(listPer, node.children, node.id);
                    }
                }
            }
            #endregion
    
     
    
    public static void SetFathersUnchecked(List<TreeNode> listNodes, string pid)
    {
          //叶子节点,则取消父节点的勾选状态,让其变成不确定状态 (否则会自动勾选父下的所有节点而显示不正确)
         foreach (var node in listNodes)
         {
              if (node.children.Count > 0)
              {
                   SetFathersUnchecked(node.children, node.id);
    
             if (node.children.Exists(c => c.Checked)//如果节点A下有勾选的子节点,则节点A取消勾选(界面上会自动变成不确定状态)
    
    || node.children.TrueForAll(c => !c.Checked))//都未勾选,则父取消勾选
                   node.Checked = false;
              }
              else
              {
                   //叶子节点
              }
         }
    }
    
    public static class Extensions
    {
       /// <summary>
       /// 转换成Json串,供界面easyui使用
       /// </summary>
       public static string ToJson(this List<TreeNode> list)
       {
            string res = DataHelper.Obj2Json(list);
            res = res.Replace(""Checked"", ""checked"");
            return res;
       }
    }
    
    通过以上操作最终就返回了类似树形结构的集合,只要在转换为Json串就OK了,当然也可以采用strbuilder的形式来拼接,但是那样操作起来有点太麻烦了,所以采取了递归的形式。
    
     
    
    第二种方式:
    
    前端页面就不用介绍了,现在只介绍后台的代码:
    
    package com.ynbd.apply.entity;
    
    import java.io.Serializable;
    import java.util.ArrayList;
    import java.util.List;
    
    import net.sf.json.JSONObject;
    /**
     * 在easyui中的tree_data.json数据中,只能有一个root节点
    * 
     * [{
     * "id":1,
     * "text":"folder1",
     * "iconCls":"icon-save",
     * "children":[{
     * "text":"File1",
     * "checked":true
     * }]
     * }]
     * 
     * easyui里面提供静态方法formatTree(List<TreeJson> list)返回结果
    * 
     * TreeJson.formatTree(treeJsonList);
     * @author PTTD
     *
     */
    
    @SuppressWarnings("serial")
    public class TreeJson implements Serializable{
        private String id;//节点id
        private String pid;//父节点id
        private String text;//文本内容,节点里面的内容
    private String iconCls;//easyui里面的样式
    private String state;//easyui里面节点的状态
    private String checked;//easyui里面是否被选中
    private JSONObject attribute=new JSONObject();//easyui里面绑定该节点自定义属性
    private List<TreeJson> children=new ArrayList<TreeJson>();
    
    
        //设置TreeJson里面的set/get方法
    public String getId() {
        return id;
        }
        public void setId(String id) {
        this.id = id;
        }
        public String getPid() {
        return pid;
        }
        public void setPid(String pid) {
        this.pid = pid;
        }
        public String getText() {
        return text;
        }
        public void setText(String text) {
        this.text = text;
        }
        public String getIconCls() {
        return iconCls;
        }
        public void setIconCls(String iconCls) {
        this.iconCls = iconCls;
        }
        public String getState() {
        return state;
        }
        public void setState(String state) {
        this.state = state;
        }
        public String getChecked() {
        return checked;
        }
        public void setChecked(String checked) {
        this.checked = checked;
        }
        public JSONObject getAttribute() {
        return attribute;
        }
        public void setAttribute(JSONObject attribute) {
        this.attribute = attribute;
        }
        public List<TreeJson> getChildren() {
        return children;
        }
        public void setChildren(List<TreeJson> children) {
        this.children = children;
        }
    
        /*
        * 编写里面的方法
    */
    public static List<TreeJson> formatTree(List<TreeJson> list){
        //定义根节点
    TreeJson root=new TreeJson();
        //定义子节点
    TreeJson node=new TreeJson();
        //定义树集合
    List<TreeJson> treeList=new ArrayList<TreeJson>();
        //定义存放所有父节点的parentNodes
        List<TreeJson> parentNodes=new ArrayList<TreeJson>();
    
        if(list.size()>0 && list !=null){
        //获取根节点
    root=list.get(0);
        //循环遍历oracle数据库中所有节点
    for( int i = 1 ; i< list.size(); i++ ){
        //获取根节点下面的子节点
    node =list.get(i);
        if(node.getPid().equals(root.getId())){
        //为root(根)节点增加子节点
    parentNodes.add(node);
        root.getChildren().add(node);
        }else{
        getChildrenNodes(parentNodes, node);
        parentNodes.add(node) ;
        }
        } 
        }
        treeList.add(root);
        return treeList;
        }
    
        /*
        * 循环遍历所有的节点,确定节点与父节点之间的父子关系
    */
    public static void getChildrenNodes(List<TreeJson> parentNodes, TreeJson node){
        /*
        * 循环遍历所有的父节点和node里面的所有节点
    * 
        * for循环里面的循环条件,循环变量的初始化,和循环变量的更新是否可以更改为
    * 自增型的,验证完这个以后就验证循环变量的自增型
    */
    for(int i=parentNodes.size()-1; i >= 0; i--){
        //获取当前的节点
    TreeJson pnode=parentNodes.get(i);
    
        if(pnode.getId().equals(node.getPid())){
        //将获取出来的子节点添加到相应的父节点里面去
    pnode.getChildren().add(node);
        //添加子节点后关闭子节点的树形,关闭二级树
    pnode.setState("closed");
        //退出本次循环
    return ;
        }else{
        /*
        * 如果查询出来不是父子关系,就在上一级节点中删除该节点栈
    * 里面的当前的节点
    * 
        * 继续循环,直到检查出该节点的子节点或者该节点里面不存在
    * 子节点后才退出for循环
    */
    parentNodes.remove(i);
        }
        }
        }
    }
    
     
    
     
  • 相关阅读:
    [转]HTML5 classList API
    高质量CSS编写规范
    CSS Hack
    谈谈JSON数据格式
    Eclipse启动时报需要安装"Java SE 6 Runtime"致无法启动解决方案
    站长问题纠结
    做站长的经验
    网站如何提高PR值
    Progit Update Check Page
    WPF随手小记之二 ——改变DataGrid样式
  • 原文地址:https://www.cnblogs.com/sxjljj/p/8676060.html
Copyright © 2011-2022 走看看