标签:style blog http color io os ar java for
最近项目用到EasyUI的treegrid控件实现树形Table,实现效果如下:
treegrid需要的json字符串样式如下
[{ "id":1, "name":"C", "size":"", "date":"02/19/2010", "children":[{ "id":2, "name":"Program Files", "size":"120 MB", "date":"03/20/2010", "children":[{ "id":21, "name":"Java", "size":"", "date":"01/13/2010", "state":"closed", "children":[{ "id":211, "name":"java.exe", "size":"142 KB", "date":"01/13/2010" },{ "id":212, "name":"jawt.dll", "size":"5 KB", "date":"01/13/2010" }] }] }]
对于树形结构数据库中数据表的设计一般为ID、Name、ParentID,C#代码设计如下:
1 public class TreeUtil 2 { 3 public static string Json(List<Hashtable> dataList) 4 { 5 // 节点列表(映射表,用于临时存储节点对象) 6 Hashtable nodeList = new Hashtable(); 7 // 将结果集存入映射表(后面将借助映射表构造多叉树) 8 for (int i = 0; i < dataList.Count; i++) 9 { 10 Hashtable dataRecord = dataList[i]; 11 Node node = new Node(); 12 node.menuid = (String)dataRecord["menuid"]; 13 node.menuname = (String)dataRecord["text"]; 14 node.parentId = (String)dataRecord["parentId"]; 15 node.icon = (String)dataRecord["icon"]; 16 node.url = (String)dataRecord["url"]; 17 nodeList.Add(node.menuid, node); 18 } 19 // 根节点 20 Node root = null; 21 //构造无序的多叉树 22 System.Collections.IDictionaryEnumerator enumerator = nodeList.GetEnumerator(); 23 while (enumerator.MoveNext()) 24 { 25 Node node = enumerator.Value as Node; 26 if (string.IsNullOrEmpty(node.parentId)) 27 { 28 root = node; 29 } 30 else 31 { 32 ((Node)nodeList[node.parentId]).addChild(node); 33 } 34 } 35 return root.ToString(); 36 } 37 /// <summary> 38 /// 节点类 39 /// </summary> 40 class Node 41 { 42 //ID 43 public String menuid; 44 45 //Name 46 public String menuname; 47 48 //父项ID 49 public String parentId; 50 51 public String icon; 52 public String url; 53 54 //子项列表 55 public List<Node> menus = new List<Node>(); 56 57 // 添加孩子节点 58 public void addChild(Node node) 59 { 60 menus.Add(node); 61 } 62 63 // 先序遍历,拼接JSON字符串 64 public override String ToString() 65 { 66 String result = "{\"" + "menuid\": \"" + menuid + "\"" + ",\"menuname\" : \"" + menuname + "\","; 67 if (string.IsNullOrEmpty(icon)) 68 { 69 result += "\"icon\":\"icon-sys\","; 70 } 71 else 72 { 73 result += "\"icon\":\"" + icon + "\","; 74 } 75 if (!string.IsNullOrEmpty(url)) 76 { 77 result += "\"url\":\"" + url + "\","; 78 } 79 if (menus.Count != 0) 80 { 81 result += "\"menus\" : ["; 82 for (int i = 0; i < menus.Count; i++) 83 { 84 result += ((Node)menus[i]).ToString() + ","; 85 } 86 result = result.Substring(0, result.Length - 1); 87 result += "]"; 88 } 89 else 90 { 91 result = result.Substring(0, result.Length - 1); 92 } 93 return result + "}"; 94 } 95 96 // 兄弟节点横向排序 97 public void sortChildren() 98 { 99 if (menus.Count != 0) 100 { 101 // 对本层节点进行排序(可根据不同的排序属性,传入不同的比较器,这里 传入ID比较器) 102 menus.Sort(new NodeIDComparator()); 103 // 对每个节点的下一层节点进行排序 104 for (int i = 0; i < menus.Count; i++) 105 { 106 ((Node)menus[i]).sortChildren(); 107 } 108 } 109 } 110 111 } 112 113 /// <summary> 114 /// 节点比较器(自定义排序规则) 115 /// </summary> 116 class NodeIDComparator : IComparer<Node> 117 { 118 // 按照节点编号比较 119 120 int IComparer<Node>.Compare(Node o1, Node o2) 121 { 122 int j1 = Convert.ToInt32(((Node)o1).menuid); 123 int j2 = Convert.ToInt32(((Node)o2).menuid); 124 return (j1 < j2 ? -1 : (j1 == j2 ? 0 : 1)); 125 } 126 } 127 128 } 129 130 131 /// <summary> 132 /// 虚拟获取数据库中的元数据 133 /// </summary> 134 class VirtualDataGenerator 135 { 136 // 构造无序的结果集列表,实际应用中,该数据应该从数据库中查询获得; 137 public static List<Hashtable> getVirtualResult() 138 { 139 List<Hashtable> dataList = new List<Hashtable>(); 140 141 Hashtable dataRecord1 = new Hashtable(); 142 dataRecord1.Add("menuid", "112000"); 143 dataRecord1.Add("text", "功能菜单1"); 144 dataRecord1.Add("parentId", "110000"); 145 146 Hashtable dataRecord2 = new Hashtable(); 147 dataRecord2.Add("menuid", "112200"); 148 dataRecord2.Add("text", "子菜单1"); 149 dataRecord2.Add("parentId", "112000"); 150 151 Hashtable dataRecord3 = new Hashtable(); 152 dataRecord3.Add("menuid", "112100"); 153 dataRecord3.Add("text", "子菜单2"); 154 dataRecord3.Add("parentId", "112000"); 155 156 Hashtable dataRecord4 = new Hashtable(); 157 dataRecord4.Add("menuid", "113000"); 158 dataRecord4.Add("text", "测试1"); 159 dataRecord4.Add("parentId", "110000"); 160 161 Hashtable dataRecord5 = new Hashtable(); 162 dataRecord5.Add("menuid", "100000"); 163 dataRecord5.Add("text", "测试2"); 164 dataRecord5.Add("parentId", ""); 165 166 Hashtable dataRecord6 = new Hashtable(); 167 dataRecord6.Add("menuid", "110000"); 168 dataRecord6.Add("text", "测试3"); 169 dataRecord6.Add("parentId", "100000"); 170 171 Hashtable dataRecord7 = new Hashtable(); 172 dataRecord7.Add("menuid", "111000"); 173 dataRecord7.Add("text", "测试4"); 174 dataRecord7.Add("parentId", "110000"); 175 176 dataList.Add(dataRecord1); 177 dataList.Add(dataRecord2); 178 dataList.Add(dataRecord3); 179 dataList.Add(dataRecord4); 180 dataList.Add(dataRecord5); 181 dataList.Add(dataRecord6); 182 dataList.Add(dataRecord7); 183 184 return dataList; 185 } 186 }
附SQLServer查询树形结构的SQL语句
with AgentTree(Code,Name,ParentCode) as ( select DL_Agent.Code,DL_Agent.Name,DL_Agent.ParentCode FROM DL_Agent where DL_Agent.Code=‘1‘ union all select DL_Agent.Code,DL_Agent.Name,DL_Agent.ParentCode from DL_Agent,AgentTree where DL_Agent.ParentCode = AgentTree.Code ) select * from AgentTree;
参考:java实现此类json字符串,特此感谢原作者
http://www.iteye.com/topic/1122125
标签:style blog http color io os ar java for
原文地址:http://www.cnblogs.com/justforcoding/p/4041514.html