csharp: DataRelation objects to represent a parent/child/Level relationship

简介: /// <summary> /// /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void Page_Load
/// <summary>
       ///
       /// </summary>
       /// <param name="sender"></param>
       /// <param name="e"></param>
       protected void Page_Load(object sender, EventArgs e)
       {
 
           var sections = new List<Section>
           {
               new Section { Id = 1, Name = "中国", ParentID = 0 },
               new Section { Id = 2, Name = "江西", ParentID = 1 },
               new Section { Id = 3, Name = "江苏", ParentID = 1 },
               new Section { Id = 4, Name = "南京", ParentID = 3 },
               new Section { Id = 5, Name = "南昌", ParentID = 2 },
               new Section { Id = 6, Name = "东湖区", ParentID = 5 },
               new Section { Id = 7, Name = "广东", ParentID = 1 },
               new Section { Id = 8, Name = "深圳", ParentID = 7 },
               new Section { Id = 9, Name = "罗湖区涂聚文", ParentID = 8 }
           };
 
           //sections = sections.OrderBy(x => x.ParentID).ThenBy(x => x.Name).ToList();
           //var stack = new Stack<Section>();
 
           //// Grab all the items without parents
           //foreach (var section in sections.Where(x => x.ParentID == default(int)).Reverse())
           //{
           //    stack.Push(section);
           //    sections.RemoveAt(0);
           //}
 
           //var output = new List<Section>();
           //while (stack.Any())
           //{
           //    var currentSection = stack.Pop();
 
           //    var children = sections.Where(x => x.ParentID == currentSection.Id).Reverse();
 
           //    foreach (var section in children)
           //    {
           //        stack.Push(section);
           //        sections.Remove(section);
           //    }
           //    output.Add(currentSection);
           //}
           //sections = output;
 
           List<MySection> mys = MenuHelper.GetMyMenuCollection(sections);
 
           //ResolveDDL<MySectionMenu>(mys);
 
           for (int i = 0; i < mys.Count; i++)
           {
                
 
               Response.Write(string.Format("ID:{0} ParentID: {1} TreeLevel: {2} Name:{3}<br/>", mys[i].Id, mys[i].ParentID, mys[i].TreeLevel,mys[i].Name));
           }
 
       }
 
 
       /// <summary>
       ///
       /// </summary>
       /// <typeparam name="T"></typeparam>
       /// <param name="mys"></param>
       protected void ResolveDDL<T>(List<T> mys) where T : MyBaseSection, new()
       {
 
           ResolveDDL<T>(mys, -1, true);
       }
       /// <summary>
       ///
       /// </summary>
       /// <typeparam name="T"></typeparam>
       /// <param name="mys"></param>
       /// <param name="currentId"></param>
       protected void ResolveDDL<T>(List<T> mys, int currentId) where T : MyBaseSection, new()
       {
           ResolveDDL<T>(mys, currentId, true);
       }
 
       /// <summary>
       /// 将一个树型结构放在一个下列列表中可供选择
       /// </summary>
       /// <typeparam name="T"></typeparam>
       /// <param name="currentId"></param>
       /// <param name="mys"></param>
       protected void ResolveDDL<T>(List<T> mys, int currentId, bool addRootNode) where T : MyBaseSection, new()
       {
           if (addRootNode)
           {
               // 所有节点的TreeLevel加一,然后添加根节点
               foreach (T my in mys)
               {
                   my.TreeLevel += 1;
               }
               T root = new T();
               root.Name = "--根节点--";
               root.Id = 0;
               root.TreeLevel = 0;
               mys.Insert(0, root);
           }
 
 
           // currentId==-1表示当前节点不存在
           if (currentId != -1)
           {
               // 本节点不可点击(也就是说当前节点不可能是当前节点的父节点)
               // 并且本节点的所有子节点也不可点击,你想如果当前节点跑到子节点的子节点,那么这些子节点就从树上消失了
               bool startChileNode = false;
               int startTreeLevel = 0;
               foreach (T my in mys)
               {
                   if (my.Id == currentId)
                   {
                       startTreeLevel = my.TreeLevel;
                       my.Enabled = false;
                       startChileNode = true;
                   }
                   else
                   {
                       if (startChileNode)
                       {
                           if (my.TreeLevel > startTreeLevel)
                           {
                               my.Enabled = false;
                           }
                           else
                           {
                               startChileNode = false;
                           }
                       }
                   }
               }
           }
       }
 
 
   }
 
   /// <summary>
   /// /
   /// </summary>
   public class Section
   {
       public int Id { get; set; }
       public string Name { get; set; }
       public int ParentID { get; set; }
   }
   /// <summary>
   ///
   /// </summary>
   public class MySection
   {
       public int Id { get; set; }
       public string Name { get; set; }
       public int ParentID { get; set; }
       public int TreeLevel { get; set; }
   }
   /// <summary>
   ///
   /// </summary>
   public class MySectionMenu : MyBaseSection
   {
 
   }
   /// <summary>
   ///
   /// </summary>
   public class MyBaseSection
   {
        public int Id
       {
           get;
           set;
       }
 
       public int ParentId
       {
           get;
           set;
       }
 
       public string Name
       {
           get;
           set;
       }
               /// <summary>
       /// 本菜单在树形结构中层级(从0开始)
       /// </summary>
       public int TreeLevel
       {
           get;
           set;
       }
 
       /// <summary>
       /// 是否可用(默认true)
       /// </summary>
       public bool Enabled
       {
           get;
           set;
       }
 
       /// <summary>
       /// 是否叶子节点(默认false)
       /// </summary>
       public bool IsTreeLeaf
       {
           get;
           set;
       }
 
 
   }
 
 
   /// <summary>
   ///
   /// </summary>
   public class MenuHelper
   {
 
       /// <summary>
       ///
       /// </summary>
       /// <param name="oldMenus"></param>
       /// <returns></returns>
       public static List<MySection> GetMyMenuCollection(List<Section> oldMenus)
       {
           List<MySection> newMenus = new List<MySection>();
           ResolveMenuCollection(oldMenus, newMenus, 0, 0);
 
           return newMenus;
       }
       /// <summary>
       ///
       /// </summary>
       /// <param name="oldMenus"></param>
       /// <param name="newMenus"></param>
       /// <param name="parentId"></param>
       /// <param name="level"></param>
       /// <returns></returns>
       private static int ResolveMenuCollection(List<Section> oldMenus, List<MySection> newMenus, int parentId, int level)
       {
           int count = 0;
           foreach (Section menu in oldMenus)
           {
               if (menu.ParentID == parentId)
               {
                   count++;
 
                   MySection my = new MySection();
                   newMenus.Add(my);
                   my.TreeLevel = level;
                   my.Id = menu.Id;             
                   my.Name = menu.Name;               
                   my.ParentID = menu.ParentID;      
 
 
                   level++;
                   int childCount = ResolveMenuCollection(oldMenus, newMenus, menu.Id, level);     
                   level--;
               }
           }
 
           return count;
       }
   }

显示结果:

ID:1 ParentID: 0 TreeLevel: 0 Name:中国
ID:2 ParentID: 1 TreeLevel: 1 Name:江西
ID:5 ParentID: 2 TreeLevel: 2 Name:南昌
ID:6 ParentID: 5 TreeLevel: 3 Name:东湖区
ID:3 ParentID: 1 TreeLevel: 1 Name:江苏
ID:4 ParentID: 3 TreeLevel: 2 Name:南京
ID:7 ParentID: 1 TreeLevel: 1 Name:广东
ID:8 ParentID: 7 TreeLevel: 2 Name:深圳
ID:9 ParentID: 8 TreeLevel: 3 Name:涂聚文

目录
相关文章
|
24天前
Transparent Data Encryption Data Dynamic and Data Dictionary Views You can query a set of dynamic and data dictionary views to find more information about Transparent Data Encryption (TDE) data.
Transparent Data Encryption Data Dynamic and Data Dictionary Views You can query a set of dynamic and data dictionary views to find more information about Transparent Data Encryption (TDE) data.
11 2
|
3月前
|
小程序 JavaScript
Avoid mutating a prop directly since the value will be overwritten whenever the parent comp
Avoid mutating a prop directly since the value will be overwritten whenever the parent comp
|
9月前
Unknown custom element: <add-employee> - did you register the component correctly? For red cursive c
原因: 1.组件名没写对(导入和注册不对应) 2.components少写了个s 3.组件命名最好是驼峰命名 4.导入时语法错误 5.代码中有两个components,后一个的值把前一个覆盖了 6.组件直接循环套用了
|
JavaScript
Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-
Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-
Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-
|
Java
Could not find class 'android.support.v4.view.ViewPager', referenced from method***
Could not find class 'android.support.v4.view.ViewPager', referenced from method***
121 0
Could not find class 'android.support.v4.view.ViewPager', referenced from method***
Access context of data source and work center view do not match
这个错误消息提示我们,data source的access context和待分配到工作中心的access context必须匹配:
Access context of data source and work center view do not match
association in CDS view is converted to LEFT OUTER MANY TO ONE JOIN in the runtime
association in CDS view is converted to LEFT OUTER MANY TO ONE JOIN in the runtime
112 0
association in CDS view is converted to LEFT OUTER MANY TO ONE JOIN in the runtime
OPA 15 - find existing item by its type.note
Created by Wang, Jerry, last modified on Nov 08, 2015
124 0
OPA 15 - find existing item by its type.note
the code place where the binding is converted to final value displayed in ui
the code place where the binding is converted to final value displayed in ui
the code place where the binding is converted to final value displayed in ui