树组织的生成
来源:互联网 发布:石家庄广电网络营业厅 编辑:程序博客网 时间:2024/05/20 11:52
先说说这个权限生成的几个需求。
数据源是从数据库读出来的。数据的结构是这样的。有个treePath,里面的存的数据是这样的。
通过“/”表明数据的组织层次结构,也就是说如果没有“/”就表明是根节点,如果有一个“/”就表明是第二层结构。这样以此类推。每一个“/”前数据表明其父节点是哪一个。就好比这样的一对数据:
10001
10001/10002
10001/10002/1003
10001/10003/1003
20001
20001/20002
组织结构就如下了:
相信大家都明白了,接下来看看我们最后要生成的结果图:
好了生成的图大家也明白了。就是这样的树状图。
下面我来说说我们实现的代码思路。首先把数据从库里面读出来。然后分析数据,最后生成JOSN对象文件,然后前台进行分析这个JSON对象数据。最后生成我们的树状图。
我们直接来看看代码:
代码中我定义了一个两个类,用来存储数据的。请看这两个类:
1 /// <summary> 2 /// 组织数据 3 /// </summary> 4 public class Organization 5 { 6 public string OrganKey { get; set; } 7 8 public string OrganName { get; set; } 9 10 public string TreePath { get; set; }11 12 public Organization(string organKey, string organName, string treePath)13 {14 this.OrganKey = organKey;15 this.OrganName = organName;16 this.TreePath = treePath;17 }18 }19 20 /// <summary>21 /// 最终的数据结构类型22 /// </summary>23 public class OrganizationResult24 {25 26 private List<OrganizationResult> lstChildren = new List<OrganizationResult>();27 28 /// <summary>29 /// 主键KEY30 /// </summary>31 public string Key { get; set; }32 33 /// <summary>34 /// 主键Name35 /// </summary>36 public string Name { get; set; }37 38 /// <summary>39 /// 获取字节点的个数40 /// </summary>41 /// <returns></returns>42 public int GetChildNodesCount()43 {44 return lstChildren.Count;45 }46 47 public string levelKey { get; set; }48 49 /// <summary>50 /// 构造初始化51 /// </summary>52 /// <param name="key"></param>53 /// <param name="name"></param>54 /// <param name="levelKey"></param>55 public OrganizationResult(string key, string name, string levelKey)56 {57 this.Key = key;58 this.Name = name;59 this.levelKey = levelKey;60 }61 62 /// <summary>63 /// 添加子节点64 /// </summary>65 /// <param name="child"></param>66 public void AddChildNodes(OrganizationResult child)67 {68 this.lstChildren.Add(child);69 }70 71 /// <summary>72 /// 根据路径获取节点73 /// </summary>74 /// <param name="index"></param>75 /// <returns></returns>76 public OrganizationResult GetChildNodesByIndex(int index)77 {78 if (this.GetChildNodesCount() < index)79 {80 return null;81 }82 else83 {84 return lstChildren[index];85 }86 }87 88 /// <summary>89 /// 获取所有的子节点90 /// </summary>91 /// <returns></returns>92 public List<OrganizationResult> GetChildNodes()93 {94 return lstChildren;95 }96 }
这个OrganizationResult是最终存放我们要的数据类。
下面是我们的数据处理方法:(请看代码)
View Code
1 public partial class Index : System.Web.UI.Page 2 { 3 /// <summary> 4 /// 数据集合 5 /// </summary> 6 private List<Organization> lstData; 7 8 protected void Page_Load(object sender, EventArgs e) 9 { 10 if (!IsPostBack) 11 { 12 this.SetOrganziationData(); 13 14 List<OrganizationResult> lstResult = this.ResolveOrganization(lstData); 15 16 this.CreateJsonFile(this.CreateJson(lstResult)); 17 } 18 } 19 20 #region 组织架构的分析 21 /// <summary> 22 /// 解析组织架构 23 /// </summary> 24 /// <param name="lstData"></param> 25 /// <returns></returns> 26 private List<OrganizationResult> ResolveOrganization(List<Organization> lstData) 27 { 28 List<OrganizationResult> lstOrganizationResult = new List<OrganizationResult>(); 29 30 Dictionary<int, List<Organization>> dicLevelData = new Dictionary<int, List<Organization>>(); 31 32 foreach (Organization item in lstData) 33 { 34 int level = item.TreePath.Split('/').Length; 35 36 if (dicLevelData.ContainsKey(level)) 37 { 38 dicLevelData[level].Add(item); 39 } 40 else 41 { 42 dicLevelData.Add(level, new List<Organization>() { item }); 43 } 44 } 45 46 // 根据键值排序 47 dicLevelData = dicLevelData.OrderBy(c => c.Key).ToDictionary(k => k.Key, k => k.Value); 48 49 foreach (int key in dicLevelData.Keys) 50 { 51 foreach (Organization item in dicLevelData[key]) 52 { 53 this.InsertOrganizationResult(key, item, lstOrganizationResult); 54 } 55 } 56 57 return lstOrganizationResult; 58 } 59 60 /// <summary> 61 /// 设置组织结构 62 /// </summary> 63 /// <param name="organizationLevel"></param> 64 /// <param name="item"></param> 65 /// <param name="lstOrganizaitonResult"></param> 66 private void InsertOrganizationResult(int organizationLevel, Organization item, List<OrganizationResult> lstOrganizaitonResult) 67 { 68 // 如果属于根目录 69 if (organizationLevel == 1) 70 { 71 lstOrganizaitonResult.Add(this.InitOrganizationResult(item)); 72 return; 73 } 74 75 // 如果不属于根目录 76 string[] treePath = item.TreePath.Split('/'); 77 List<int> lstLevel = new List<int>(); 78 this.FindParentPath(lstOrganizaitonResult, lstLevel, treePath); 79 List<OrganizationResult> lstChildrenTemp = lstOrganizaitonResult; 80 foreach (int level in lstLevel) 81 { 82 if (lstOrganizaitonResult[level].GetChildNodesCount() == 0) 83 { 84 lstChildrenTemp = lstOrganizaitonResult[level].GetChildNodes(); 85 } 86 else 87 { 88 lstChildrenTemp = lstChildrenTemp[level].GetChildNodes(); 89 } 90 } 91 92 lstChildrenTemp.Add(this.InitOrganizationResult(item)); 93 } 94 95 /// <summary> 96 /// 获取根目录父节点和父节点的位置 97 /// </summary> 98 /// <param name="lstOrganizaitonResult"></param> 99 /// <param name="parentIndex"></param>100 /// <param name="childIndex"></param>101 /// <param name="treePath"></param>102 private void FindParentPath(List<OrganizationResult> lstOrganizaitonResult, List<int> lstLevel, string[] treePath)103 {104 for (int rootIndex = 0; rootIndex < lstOrganizaitonResult.Count; rootIndex++)105 {106 string levelKey = lstOrganizaitonResult[rootIndex].levelKey;107 108 // 找到第一任父节点继续往下找109 if (treePath[0] == levelKey)110 {111 lstLevel.Add(rootIndex);112 113 if (treePath.Length == 1)114 {115 return;116 }117 118 // 如果不存在子节点,则直接添加119 if (lstOrganizaitonResult[rootIndex].GetChildNodesCount() == 0)120 {121 return;122 }123 124 string[] tempLevel = new string[treePath.Length - 1];125 Array.Copy(treePath, 1, tempLevel, 0, tempLevel.Length);126 this.FindParentPath(lstOrganizaitonResult[rootIndex].GetChildNodes(), lstLevel, tempLevel);127 return;128 }129 else130 {131 continue;132 }133 }134 }135 136 /// <summary>137 /// 初始化一个组织结果数据138 /// </summary>139 /// <param name="key"></param>140 /// <param name="name"></param>141 /// <returns></returns>142 private OrganizationResult InitOrganizationResult(string key, string name, string parentKey)143 {144 return new OrganizationResult(key, name, parentKey);145 }146 147 /// <summary>148 /// 初始化一个组织结果数据149 /// </summary>150 /// <param name="key"></param>151 /// <param name="name"></param>152 /// <returns></returns>153 private OrganizationResult InitOrganizationResult(Organization organ)154 {155 string levelKey = null;156 string[] tempArr = organ.TreePath.Split('/');157 158 // 设置自己属于哪一个节点159 if (tempArr.Length == 1)160 {161 levelKey = tempArr[0];162 }163 else164 {165 levelKey = tempArr[tempArr.Length - 1];166 }167 168 return new OrganizationResult(organ.OrganKey, organ.OrganName, levelKey);169 }170 171 /// <summary>172 /// 初始化数据信息173 /// </summary>174 private void SetOrganziationData()175 {176 if (lstData == null)177 {178 lstData = new List<Organization>();179 }180 181 lstData.AddRange(182 new Organization[]{183 184 new Organization("001","年级一","00001"),185 186 // 班级一的学生信息(年级一)187 new Organization("002","班级一","00001/10001"),188 new Organization("003","学生A","00001/10001/11001"),189 new Organization("004","学生B","00001/10001/11002"), 190 191 // 班级二的学生信息(年级一)192 new Organization("005","班级二","00001/10002"),193 new Organization("006","学生C", "00001/10002/12001"),194 195 new Organization("007","年级二","00002"),196 197 // 班级一的学生信息(年级二)198 new Organization("008","班级一","00002/20001"),199 new Organization("009","学生D","00002/20001/12001"),200 new Organization("010","学生E","00002/20001/12002"),201 202 // 班级二的学生信息(年级二)203 new Organization("011","班级二","00002/20002"),204 new Organization("012","学生F","00002/20002/20001")205 }206 );207 }208 #endregion 组织架构的分析209 210 #region 生成JSON对象211 212 /// <summary>213 /// 生成JSON对象214 /// </summary>215 /// <param name="lstResult"></param>216 /// <returns></returns>217 private string CreateJson(List<OrganizationResult> lstResult)218 {219 StringBuilder strBuild = new StringBuilder("[");220 221 int index = 0;222 223 foreach (OrganizationResult item in lstResult)224 {225 if (index == 0)226 {227 strBuild.Append(this.CreateElement(item));228 strBuild.Append("\r\n");229 }230 else {231 strBuild.Append(","+this.CreateElement(item));232 strBuild.AppendLine("\r\n");233 }234 index++;235 236 }237 strBuild.AppendLine("]");238 return strBuild.ToString();239 }240 241 /// <summary>242 /// 创建一个对象243 /// </summary>244 /// <param name="item"></param>245 /// <returns></returns>246 private string CreateElement(OrganizationResult item)247 {248 StringBuilder strBuild = new StringBuilder("");249 250 if (item.GetChildNodesCount() != 0)251 {252 strBuild.AppendLine("{\"id\":" + "\"" + item.Key + "\",");253 strBuild.AppendLine("\"text\":" + "\"" + item.Name + "\",");254 strBuild.AppendLine("\"children\":[");255 bool isFirst = true;256 257 foreach (OrganizationResult element in item.GetChildNodes())258 {259 if (isFirst)260 {261 strBuild.Append(this.CreateElement(element));262 263 isFirst = false;264 }265 else266 {267 strBuild.AppendLine("," + this.CreateElement(element));268 }269 }270 271 strBuild.AppendLine("]}");272 }273 else274 {275 strBuild.AppendLine("{\"text\":" + "\"" + item.Name + "\"}");276 277 return strBuild.ToString();278 }279 280 return strBuild.ToString();281 }282 #endregion283 284 #region 创建JSON文件285 /// <summary>286 /// 创建JSON文件 287 /// </summary>288 /// <param name="fileData"></param>289 private void CreateJsonFile(String fileData)290 {291 string filePath = System.AppDomain.CurrentDomain.BaseDirectory + "data/tree_data.json";292 293 if (File.Exists(filePath))294 {295 File.Delete(filePath);296 }297 298 using (StreamWriter sw = new StreamWriter(new FileStream(filePath, FileMode.Create, FileAccess.Write, FileShare.Write), System.Text.Encoding.UTF8))299 {300 sw.WriteLine(fileData);301 }302 }303 #endregion304 }305 306 /// <summary>307 /// 组织数据308 /// </summary>309 public class Organization310 {311 public string OrganKey { get; set; }312 313 public string OrganName { get; set; }314 315 public string TreePath { get; set; }316 317 public Organization(string organKey, string organName, string treePath)318 {319 this.OrganKey = organKey;320 this.OrganName = organName;321 this.TreePath = treePath;322 }323 }
- 树组织的生成
- JS生成的组织结构图
- flex 生成组织结构图
- 帮助你生成组织结构图的jQuery插件 - jOrgChart
- B+树的组织结构
- PHP生成组织架构图
- orgChart生成组织结构图应用
- 基于SSM的组织树的实现
- 项目开发中源代码树的组织
- 项目开发中源代码树的组织
- 项目开发中源代码树的组织
- 项目开发中源代码树的组织
- 项目开发中源代码树的组织
- 项目开发中源代码树的组织
- 项目开发中源代码树的组织
- 项目开发中源代码树的组织
- 项目开发中源代码树的组织
- 项目开发中源代码树的组织
- 不公平的社会
- ANDROID轻量级ORM框架ORMLITE学习笔记(1)-初识
- wordpress本地 运行 很慢 解决方案
- MyEclipse 快捷键大全(转)
- android 用ListView实现表格样式
- 树组织的生成
- “飞行模式”与“离线模式”
- hdoj 1056
- java 将 properties 文件 加载到内存
- java中getResourceAsStream的用法
- javascript position属性absolute与relative 详解
- 用linux装逼->w3m
- 给盒子的贺文
- 不错的JS日历选择器