/// <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);
var outputlist = (from mysection in mys orderby mysection.TreeLevel descending select mysection).ToList();
var outputstringlist = (from mysection in mys orderby mysection.TreeLevel descending select mysection.Name).ToList(); for (int i = 0; i < outputlist.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));
Response.Write(string.Format("ID:{0} ParentID: {1} TreeLevel: {2} Name:{3}<br/>", outputlist[i].Id, outputlist[i].ParentID, outputlist[i].TreeLevel, outputlist[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:涂聚文

csharp: DataRelation objects to represent a parent/child/Level relationship的更多相关文章

  1. [NHibernate]Parent/Child

    系列文章 [Nhibernate]体系结构 [NHibernate]ISessionFactory配置 [NHibernate]持久化类(Persistent Classes) [NHibernate ...

  2. 服务启动Apache服务,错误Parent: child process exited with status 3 -- Aborting.解决

    不能启动apache,或者使用wamp等集成包后,唯独apache服务启动后有停止,但是把东西搬到其他机器上却没事问题可能和网络有关,我查了很多资料首先找打apache的错误报告日志,发现现实诸多的调 ...

  3. Effective Java 21 Use function objects to represent strategies

    Theory In the Java the function pointers is implemented by the declaring an interface to represent s ...

  4. XPath学习:parent,child

    XPath 是一门在 XML 文档中查找信息的语言.XPath 可用来在 XML 文档中对元素和属性进行遍历. XPath 是 W3C XSLT 标准的主要元素,并且 XQuery 和 XPointe ...

  5. NHibernate讲解

    第1章 NHibernate体系结构 总览 对NHibernate体系结构的非常高层的概览: 这幅图展示了NHibernate使用数据库和配置文件数据来为应用程序提供持久化服务(和持久化的对象). 我 ...

  6. Introspection in Python How to spy on your Python objects Guide to Python introspection

    Guide to Python introspection https://www.ibm.com/developerworks/library/l-pyint/ Guide to Python in ...

  7. TIJ——Chapter One:Introduction to Objects

    ///:~容我对这个系列美其名曰"读书笔记",其实shi在练习英文哈:-) Introduction to Objects Object-oriented programming( ...

  8. Exploring Python Code Objects

    Exploring Python Code Objects https://late.am/post/2012/03/26/exploring-python-code-objects.html Ins ...

  9. Accessing an element's parent with ElementTree(转)

    Today I ran across a situation where I needed to programmatically remove specific elements from a KM ...

随机推荐

  1. 如何用django开发一个简易个人Blog

    功能概要:(目前已实现功能) 公共展示部分: 1.网站首页展示已发布的博客记录,包括名称.摘要信息.发布日期.阅读量及评论数. 2.首页文章列表可按照分类筛选. 3.点击标题或阅读全文链接,进入博客阅 ...

  2. Gradle中的buildScript代码块

    在编写Gradle脚本的时候,在build.gradle文件中经常看到这样的代码: build.gradle 1 2 3 4 5 6 7 8 9 buildScript { repositories ...

  3. html5 Application Cache——加快简历二次访问速度

    上篇博客(在github上写个人简历——最简单却又不容易的内容罗列)介绍了我在github上放的一个个人在线简历,有朋友看了后告诉我一个很大缺陷,使用github挺慢的,每次看的时候都很慢,第一反应这 ...

  4. Repeater绑定数组并显示其值

    web开发中,尤其是对于数据展示,不得不说Repeater是一个万能的控件,而且使用也很方便. 在ASP.NET中将数组绑定到Repeater中请问如何在Repeater前台页面中显示该数组的值? s ...

  5. 实现两个MySQL数据库之间的主从同步

    一.    概述MySQL从3.23.15版本以后提供数据库复制(replication)功能,利用该功能可以实现两个数据库同步.主从模式.互相备份模式的功能二.    环境操作系统:Linux 2. ...

  6. 知方可补不足~Sqlserver发布订阅与sql事务的关系

    回到目录 前几讲说了一下通过sqlserver的发布与订阅来实现数据的同步,再通过EF这个ORM架构最终实现架构系统的读写分离,而在使用发布与订阅来实现数据同步时,需要我们注意几点,那就是当操作被使用 ...

  7. [Maven]Eclipse插件之Maven配置及问题解析.

    前言:今天在自己环境装了Maven环境, 并且安装了Eclipse插件, 在查找插件过程中确实遇到一些问题, 好不容易找到一个  却又有问题.装好了插件之后, 用Eclipse创建Maven项目却出现 ...

  8. Atitit  ocr识别原理 与概论 attilax总结

    Atitit  ocr识别原理 与概论 attilax总结 1.1. Ocr的过程与流程1 1.2. OCR不同技术细分略有不同,但大概原理是一样的. 即主要技术过程是:二值化(又叫归一化)----- ...

  9. 无法启动此程序,因为计算机中丢失AdbWinApi.dll。尝试重新安装该程序以解决此问题

    第一次搭建android开发环境,装完adb以后,打开DOS验证安装是否成功:但输入adb logcat调试时,系统弹出以下异常的对话框: 无法启动此程序,因为计算机中丢失AdbWinApi.dll. ...

  10. SQLSERVER中的ALLOCATION SCAN和RANGE SCAN

    SQLSERVER中的ALLOCATION SCAN和RANGE SCAN 写这篇文章的开始,我还不知道ALLOCATION SCAN的工作原理是怎样的,网上资料少得可怜 求助了园子里的某位大侠,他看 ...