zoukankan      html  css  js  c++  java
  • Extjs treePanel 后台Json的两种构建方法

            public string json = "";
            public string QueryMenuTreeJson(string ParentID, string userId)
            {
                json = "";
                GetResourceTreeJson(ParentID, userId);
                return json;
            }
            public string GetResourceTreeJson(string ParentID, string userId)
            {
                DataTable dt = new DataTable();
                string sql = "select c.Title as 'text',c.ID,case when c.IsLeaf=0 then 'false' else 'true' end as 'leaf',c.Url as 'url'"
                + " from SysUserRole a,SysRoleResource b,SysResource c where a.UserID = " + userId +
                  " and a.IsDeleted = 0 and b.IsDeleted = 0 and c.IsDeleted = 0 "
                + " and b.RoleID = a.RoleID and b.ResourceID = c.ID and c.ParentID = " + ParentID + " order by c.ID";
                using (End.DataCore.IDbAction db = End.DataCore.DbSessionFactory.GetDbSession())
                {
                    dt = db.ExecuteQuery(sql);
                }
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    if (dt.Rows[i][2].ToString() != "true")
                    {
                        json += "{'text':'" + dt.Rows[i][0] + "'";
                        json += ",'leaf':'false','id':'" + dt.Rows[i][1] + "','children':[";
                        GetResourceTreeJson(dt.Rows[i][1].ToString(), userId);
                        json += "]";
                    }
                    else
                    {
                        json += "{'text':'" + dt.Rows[i][0] + "','leaf':'true','id':'" + dt.Rows[i][1] + "','url':'" + dt.Rows[i][3] + "'";
                    }
                    json += "},";
                }
                return json;
            }
    

      上面的是小白自己的写的一种完全手动拼接的Json数据,希望可以给大家帮助。但是有一定的弊端(每次递归都去查询数据库,还有就是拼接存在一定的安全性因素),后来小白就改成了用类封装的方式,然后通过返回List的类型的数据,然后通过json类的帮助,自动将list转换成json数据,而且我上面的代码是每进行一次的递归操作,就去数据库中查询一次,这样涉及到数据库的开关,因此,小白将所有的相关的数据都一次性查了出来,然后将dt 作为参数,递归传入方法中,详情可以参照代码。

    List<Model.ResourceNode> NodeList = null;
    
            public List<Model.ResourceNode> GetMenuTreeStore(string userId)
            {
                NodeList = new List<Model.ResourceNode>();
                DataTable dt = new DataTable();
                List<End.DataCore.ModelBase.Column> list = new List<End.DataCore.ModelBase.Column>();
                list.Add(new End.DataCore.ModelBase.Column("@userID", (userId)));
                string sql = "select c.Title as 'text',c.ID,case when c.IsLeaf=0 then 'false' else 'true' end as 'leaf',c.Url as 'url',c.ParentID as 'parentId'  "
                + " from SysUserRole a,SysRoleResource b,SysResource c where  userId = @userID" 
                + " and a.IsDeleted = 0 and b.IsDeleted = 0 and c.IsDeleted = 0 "
                + " and b.RoleID = a.RoleID and b.ResourceID = c.ID order by c.ID";
                using (End.DataCore.IDbAction db = End.DataCore.DbSessionFactory.GetDbSession())
                {
                    dt = db.ExecuteQuery(sql, list);
                }
                string sqlSelect = "parentId = 0";
                DataTable newTable = dt.Copy();
                newTable.Rows.Clear();
                DataRow[] rows = dt.Select(sqlSelect);
                for (int i = 0; i < rows.Length; i++)
                {
                    newTable.Rows.Add(rows[i].ItemArray);
                }
                for (int i = 0; i < newTable.Rows.Count; i++)
                {
                    ResourceNode childrenNode = new ResourceNode();
                    childrenNode.text = newTable.Rows[i][0].ToString();
                    childrenNode.leaf = newTable.Rows[i][2].ToString();
                    childrenNode.ID = Convert.ToInt32(newTable.Rows[i][1]);
                    childrenNode.url = newTable.Rows[i][3].ToString();
                    GetResourceTreeList(dt, childrenNode);
                    NodeList.Add(childrenNode);
                }
                return NodeList;
            }下面的为递归法调用的GetResourceTreeList方法,他的优点就在于不需要每次递归都去查询数据库,他是对整个的表格进行过滤筛选,代码如下:
    public void GetResourceTreeList(DataTable dt, Model.MenuNode node)
    {
    string sqlSelect = "parentId = " + node.ID;
    DataTable newTable = dt.Copy();
    newTable.Rows.Clear();
    DataRow[] rows = dt.Select(sqlSelect);
    for (int i = 0; i < rows.Length; i++)
    {
    newTable.Rows.Add(rows[i].ItemArray);
    }
    node.children = new List<MenuNode>();
    for (int i = 0; i < newTable.Rows.Count; i++)
    {
    if (newTable.Rows[i][2].ToString() != "true")
    {
    MenuNode resourceNode = new MenuNode();
    resourceNode.text = newTable.Rows[i][0].ToString();
    resourceNode.leaf = newTable.Rows[i][2].ToString();
    resourceNode.ID = Convert.ToInt32(newTable.Rows[i][1]);
    GetResourceTreeList(dt, resourceNode);
    node.children.Add(resourceNode);
    }
    else
    {
    MenuNode childrenNode = new MenuNode();
    childrenNode.text = newTable.Rows[i][0].ToString();
    childrenNode.leaf = newTable.Rows[i][2].ToString();
    childrenNode.ID = Convert.ToInt32(newTable.Rows[i][1]);
    childrenNode.url = newTable.Rows[i][3].ToString();
    node.children.Add(childrenNode);
    }
    }
    
    }下面的是代码是类的声明。
    

      

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace OA.Core.Model
    {
        public class ResourceNode
        {
            private int Id;
            private string Text;
            private string Leaf;
            private string Url;
            private List<ResourceNode> Children;
    
            public Int32 ID
            {
                get
                {
                    return this.Id;
                }
                set
                {
                    this.Id = value;
                }
            }
    
            public string text
            {
                get
                {
                    return this.Text;
                }
                set
                {
                    this.Text = value;
                }
            }
    
            public string leaf
            {
                get
                {
                    return this.Leaf;
                }
                set
                {
                    this.Leaf = value;
                }
            }
    
            public string url
            {
                get
                {
                    return this.Url;
                }
                set
                {
                    this.Url = value;
                }
            }
    
            public List<ResourceNode> children
            {
                get
                {
                    return this.Children;
                }
                set
                {
                    this.Children = value;
                }
            }
        }
    }
    

    在递归方法都写好的同时,小白还遇到一个问题,就是直接将获取List转换成的数据传入前台,然后直接调用的时候,发现一个问题,就是数据结构为:Children Text这种形式,然后最终发现竟然在界面上不显示,然后小白通过喊救兵,在@bom wu的引导下,发现Treepanel对数据都严格区分大小写,然后我后来又将类改成上面的样子,这一点大家要注意,而且,如果要加上treePanel Node不是默认的属性,例如Url,可以在Store里面加上Model或者加上fields属性,来解析。  

    最后,衷心的希望小白的这篇文章能对大家在接触树的时候有帮助!谢谢大家的阅读。


    作者:wangqc
    出处:http://www.cnblogs.com/wangqc/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
    该文章也同时发布在我的独立博客中-wangqc

  • 相关阅读:
    [单调栈] Jzoj P4260 最大子矩阵
    [前缀和] Jzoj P4259 矩形
    [欧拉回路][状压dp] Jzoj P3290 吃货JYY
    [组合数][枚举] Jzoj P3332 棋盘游戏
    [欧拉函数][dp][快速幂] Jzoj P1161 机器人M号
    [exgcd] Jzoj P1158 荒岛野人
    [带权并查集] Jzoj P1503 体育场
    [dfs][树的直径] Jzoj P1737 删边
    [差分][倍增lca][tarjan] Jzoj P3325 压力
    [dfs] Jzoj P1497 景点中心
  • 原文地址:https://www.cnblogs.com/wangqc/p/ExtjsTreePanelJsonStrore.html
Copyright © 2011-2022 走看看