Extjs treePanel 后台Json的两种构建方法
2013-07-10 15:53
387 查看
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属性,来解析。
最后,衷心的希望小白的这篇文章能对大家在接触树的时候有帮助!谢谢大家的阅读。
相关文章推荐
- 分享一个递归无限级拼接Json的方法---ExtJs的TreePanel和TreeGrid均适用(Ef,Lambda,Linq,IQueryable,List)
- treePanel json java后台
- aspx后台传递Json到前台的两种接收方法
- aspx后台传递Json到前台的两种接收方法推荐
- ExtJs TreePanel使用TreeLoader在IE下无法正常加载显示的解决方法
- ExtJs TreePanel使用TreeLoader在IE下无法正常加载显示的解决方法
- [JAVASCRIPT][EXTJS]直接用JSON创建树形控件(Ext.tree.TreePanel )(转)
- fastjson和普通的json有两种方法在后台使用
- ExtJs动态生成treepanel的Json格式
- ajax请求后台返回json的两种处理方法
- extjs的treepanel 后台并没有按照规定的结构返回数据时解决方案
- EXTJS桌面显示窗口(左边:TREE,右边:PANEL),点击按钮弹出窗口编辑数据提交后台PHP。
- extjs中treepanel属性和方法
- 两种方法在Django框架中支持后台返回包含中文的JSON/数组格式
- Extjs4处理后台json数据中日期和时间的方法
- ExtJs动态生成treepanel的Json格式
- Extjs — 两种向后台传送数据的方法
- aspx后台传递Json到前台的两种接收方法推荐
- extjs中treepanel属性和方法
- ExtJS EditorGridPanel 示例之JSON格式Store前后台增删改查