csharp: DataRelation objects to represent a parent/child/Level relationship
/// <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的更多相关文章
- [NHibernate]Parent/Child
系列文章 [Nhibernate]体系结构 [NHibernate]ISessionFactory配置 [NHibernate]持久化类(Persistent Classes) [NHibernate ...
- 服务启动Apache服务,错误Parent: child process exited with status 3 -- Aborting.解决
不能启动apache,或者使用wamp等集成包后,唯独apache服务启动后有停止,但是把东西搬到其他机器上却没事问题可能和网络有关,我查了很多资料首先找打apache的错误报告日志,发现现实诸多的调 ...
- 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 ...
- XPath学习:parent,child
XPath 是一门在 XML 文档中查找信息的语言.XPath 可用来在 XML 文档中对元素和属性进行遍历. XPath 是 W3C XSLT 标准的主要元素,并且 XQuery 和 XPointe ...
- NHibernate讲解
第1章 NHibernate体系结构 总览 对NHibernate体系结构的非常高层的概览: 这幅图展示了NHibernate使用数据库和配置文件数据来为应用程序提供持久化服务(和持久化的对象). 我 ...
- 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 ...
- TIJ——Chapter One:Introduction to Objects
///:~容我对这个系列美其名曰"读书笔记",其实shi在练习英文哈:-) Introduction to Objects Object-oriented programming( ...
- Exploring Python Code Objects
Exploring Python Code Objects https://late.am/post/2012/03/26/exploring-python-code-objects.html Ins ...
- Accessing an element's parent with ElementTree(转)
Today I ran across a situation where I needed to programmatically remove specific elements from a KM ...
随机推荐
- 修复Telerik reporting 在网页中使用时的样式
在ASP.NET 网页或ASP MVC中嵌入Telerik Reporting时,报表出来的样式是有问题的,按扭的位置错位了. 在页面中引入以下CSS文件可以将报表样式修复从而回到正常的报表样式. . ...
- Redmined的历史记录显示 "Updated by {{author}} {{age}} ago"
最近Redmine出了点问题,简单查了一下,是ruby的本地冲突包i18n导致的, 先到redmine中跑命令: gem list --local, 查出本地ruby安装的所有的包 这里可以看到i1 ...
- Java-接口练习1
1.(1)编写一个接口ShapePara,要求: 接口中的方法: int getArea():获得图形的面积.int getCircumference():获得图形的周长 (2)编写一个圆类Circl ...
- 基础才是重中之重~AutoMapper为已有目标对象映射
回到目录 AutoMapper各位一定不会陌生,大叔之前的文章中也提到过,曾经也写过扩展方法,以方便程序开发人员去使用它,而在最近,大叔在一个API项目里,在一个POST请求由DTO对象为实体对象赋值 ...
- 爱上MVC~MVC4模型验证可以放在前端
回到目录 MVC4.0推出后,在模型验证上有了一个新的改近,它支持前端验证,即在用户POST之前,如果验证失败,则Action(POST方式的)不会被执行,而直接停留在原视图,这对于用户体验是好的,它 ...
- javascript_core_05之正则表达式
1. 检索关键词: ①检索固定关键词的位置: var i=str.indexOf(“关键词”,fromi):在str中查找fromi位置后,下一个关键词的下标位置:省略fromi,从0开始: var ...
- 移动端IM开发需要面对的技术问题
1.前言 这两年多一直从事网易云信 iOS 端 IM SDK的开发,期间不断有兄弟部门的同事和合作伙伴过来问各种技术细节,干脆统一介绍下一个IM APP的方方面面,包括技术选型(包括通讯方式,网络连接 ...
- JQuery学习之各种效果演示
1.隐藏与显示:hide()和show(),toggle() **隐藏: $("#hide").click(function(){ $("p").hide(); ...
- 【.Net底层剖析】3.用IL来理解属性
.Net底层剖析目录章节 1.[深入浅出.Net IL]1.一个For循环引发的IL 2.[.Net底层剖析]2.stfld指令-给对象的字段赋值 3.[.Net底层剖析]3.用IL来理解属性 未完待 ...
- 【解决方案】安装vssdk_full.exe遇到的问题
Stop Block: CompatibilityMode : Windows Program Compatibility mode is on. Turn it off and then try S ...