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



 

 

你可能感兴趣的:(easyui)