zoukankan      html  css  js  c++  java
  • 做权限树时 使用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的形式来拼接,但是那样操作起来有点太麻烦了,所以采取了递归的形式。



     
  • 相关阅读:
    社会影响力入门:打造有所作为的公司
    JSP中的include有哪些?有什么差别?
    关于程序猿怎样降低程序Bug的若干建议
    linux文件打开模式
    IntelliJ IDEA 问题总结之中的一个 —— jar包、assets、maven、git
    linux下改动内核參数进行Tcp性能调优 -- 高并发
    思科模拟器配置三层交换机局域网
    MFC调试小技巧
    JAVA基础编程50题(10-12题)具体解释
    加速度传感器的原理和应用-手机翻转、失重检测、运动检测、位置识别
  • 原文地址:https://www.cnblogs.com/jx270/p/4261353.html
Copyright © 2011-2022 走看看