/// <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. jetty

    相关的文章太多了,我只按照自己的意思做简单总结. 参见: http://www.cnblogs.com/duanxz/p/3154982.html http://www.cnblogs.com/win ...

  2. Node.js与Sails~日志机制log

    回到目录 看到Sails的日志就会想起来log4net,确实它们在很多地方是相似的,都是采用分级别记录的方式,而sails我觉得在使用上更加方便,它不需要我们做多于的事情,直接sails.log.级别 ...

  3. EF架构~在T4模版中自定义属性的getter和setter

    回到目录 T4模版为我们在ORM操作上提供了便捷,它很方便的可以对实体进行全局性的修改,之前我介绍过通过T4来为属性加默认性,而今天我主要告诉大家如何使用T4模版将getter,setter块改为自己 ...

  4. Atitit 图像金字塔原理与概率 attilax的理解总结qb23

    Atitit 图像金字塔原理与概率 attilax的理解总结qb23 1.1. 高斯金字塔  (  Gaussianpyramid): 拉普拉斯金字塔 (Laplacianpyramid):1 1.2 ...

  5. Web信息架构——设计大型网站(第3版)(久负盛名经典再现,信息架构设计领域基石之作!)

    Web信息架构——设计大型网站(第3版)(久负盛名经典再现,信息架构设计领域基石之作!) [美]]Peter Morville(彼得·莫维尔)  Louis Rosenfeld(路易斯·罗森菲尔德) ...

  6. salesforce 零基础学习(三十六)通过Process Builder以及Apex代码实现锁定记录( Lock Record)

    上一篇内容是通过Process Builder和Approval Processes实现锁定记录的功能,有的时候,往往锁定一条记录需要很多的限制条件,如果通过Approval Processes的条件 ...

  7. 安装Jenkins

    jenkins是一个广泛用于持续构建的可视化web工具,持续构建说得更直白点,就是各种项目的"自动化"编译.打包.分发部署的工具 1.jenkins的官网 2.jenkins各个系 ...

  8. How Google TestsSoftware - Part One

    This is the firstin a series of posts on this topic.The one question I get morethan any other is &qu ...

  9. Callable、Future、RunnableFuture、FutureTask的原理及应用

    1. Callable.Future.RunnableFuture.FutureTask的继承关系 在多线程编程中,我们一般通过一个实现了Runnable接口的对象来创建一个线程,这个线程在内部会执行 ...

  10. ZZUOJ 1199 大小关系(拓扑排序,两种方法_判断入度和dfs回路判断)

    /* 这道题如果按照度为0的节点来判断的时候,将度为0的节点和其相连的节点(度数并减去1) 从图中去掉,如果度为0的节点的个数为0个但是图中的节点没有都去掉的 时候那么说明 出现了回路!用这种方法必须 ...