返回目录

这个问题困扰了我很久,今天终于把它解决了,心中的喜悦可想而知,赶快把它记录一下

标题无限级联下拉列表框的含义:

可能有一个树型结构的表,它可能有ID,Name,ParentID,Level等字段,下面要实现的就是从一级节点开始,一级一级的列出来,并以

下拉列表框的形式体现出来,就像是N级联动。

效果图:

两个问题:

1 建立操作时的联动,它不需要进行自动绑定

2 编辑操作时的联运,它需要根据子节点,逐级自己绑定到父节点,直到根

实现:

JS代码

 1 <script type="text/javascript">
 2     function areaOnSelect(obj) {
 3         var res = '';
 4         $.ajax({ url: '@Url.Action("GetSubTree")',
 5             type: 'GET',
 6             data: { parentId: obj.value },
 7             success: function (msg) {
 8                 $(obj).nextAll().remove();
 9                 res = "<select name='Sub' οnchange='areaOnSelect(this)'>";
10                 res += "<option value=''>请选择</option>";
11                 $.each(msg, function (i, item) {
12                     res += "<option value='" + item["ID"] + "'>" + item["Name"] + "</option>";
13                 });
14                 res += "</select>";
15                 if ($(res).find("option").size() > 1)
16                     $(obj).after(res);
17             }
18         });
19     }
20 </script>

C#代码:

 1     #region 树型结构相关
 2         /// <summary>
 3         /// 递归找老祖宗
 4         /// </summary>
 5         /// <param name="father"></param>
 6         void GetFather(SubItem father)
 7         {
 8             if (father != null)
 9             {
10                 father.Parent = _subList.FirstOrDefault(i => i.ID == father.ParentID);
11                 GetFather(father.Parent);
12             }
13         }
14
15         /// <summary>
16         /// 弟妹找子孙
17         /// </summary>
18         /// <param name="father">父对象</param>
19         void getSons(SubItem father)
20         {
21             if (father != null)
22             {
23                 father.Sons = _subList.Where(item =>
24                     item.ParentID.Equals(father.ID)).ToList();
25                 father.Sons.ForEach(item =>
26                 {
27                     item.Parent = father;
28                     getSons(item);
29                 });
30             }
31         }
32
33
34         #endregion

C#拼接下拉列表框相关:

 1       /// <summary>
 2         /// 递归得到它的所有祖宗以selectlist的形式进行拼接
 3         /// </summary>
 4         /// <param name="son"></param>
 5         /// <param name="sbr"></param>
 6         void getSelectList(SubItem son, StringBuilder sbr)
 7         {
 8             StringBuilder inSbr = new StringBuilder();
 9             if (son != null)
10             {
11                 if (son.ParentID == 0)
12                     inSbr.Append("<select name='Parent' onchange = 'areaOnSelect(this)' >");
13                 else
14                     inSbr.Append("<select name='Sub'>");
15                 GetCommon_CategoryByLevel(son.Level).ToList().ForEach(i =>
16                {
17                    if (i.ID == son.ID)
18                        inSbr.Append("<option value='" + i.ID + "' selected='true'>" + i.Name + "</option>");
19                    else
20                        inSbr.Append("<option value='" + i.ID + "'>" + i.Name + "</option>");
21                });
22
23                 inSbr.Append("</select>");
24                 sbr.Insert(0, inSbr);
25                 getSelectList(son.Parent, sbr);
26             }
27         }

C#得到同一深度的节点(同辈节点)相关:

 1      /// <summary>
 2         /// 得到指定深度的列表
 3         /// </summary>
 4         /// <param name="level"></param>
 5         /// <returns></returns>
 6         public List<SubItem> GetCommon_CategoryByLevel(int level)
 7         {
 8             var linq = from data1 in _subList
 9                        join data2 in _subList on data1.ParentID equals data2.ID into list
10                        select new SubItem
11                        {
12                            ID = data1.ID,
13                            Level = data1.Level,
14                            Name = data1.Name,
15                            Parent = list.FirstOrDefault(),
16                            ParentID = data1.ParentID,
17                        };
18             return linq.Where(i => i.Level.Equals(level)).ToList();
19         }

MVC页面action相关:

 1       public ActionResult Category(int? id)
 2         {
 3             ViewData["Parent"] = new SelectList(_subList.Where(i => i.ID == (id ?? 0)), "ID", "Name", id ?? 1);
 4             SubItem current = _subList.FirstOrDefault(i => i.ID == (id ?? 1));
 5             GetFather(current);
 6             StringBuilder sbr = new StringBuilder();
 7             getSelectList(current, sbr);
 8             ViewData["edit"] = sbr.ToString();//修改时,进行绑定
 9             return View();
10         }

MVC页面代码相关:

1 @Html.Raw(ViewData["edit"].ToString())

C#树型结构实体类相关:

 1     /// <summary>
 2     /// 树型分类结构
 3     /// </summary>
 4     public class Category
 5     {
 6         /// <summary>
 7         /// 父ID
 8         /// </summary>
 9         public int ParentID { get; set; }
10         /// <summary>
11         /// 树ID
12         /// </summary>
13         public int ID { get; set; }
14         /// <summary>
15         /// 树名称
16         /// </summary>
17         public string Name { get; set; }
18         /// <summary>
19         /// 深度
20         /// </summary>
21         public int Level { get; set; }
22         /// <summary>
23         /// 子孙节点
24         /// </summary>
25         public List<Category> Sons { get; set; }
26         /// <summary>
27         /// 父节点
28         /// </summary>
29         public Category Parent { get; set; }
30     }

好了,现在我们的N级无限下拉列表框就做好了,呵呵!

返回目录

树型结构~无限级联下拉列表框相关推荐

  1. 无限极分类php简单,创建无限极分类树型结构的简单方法

    先上效果图 顶级分类其实就是一级分类,二级分类也叫作一级分类的子分类,在这个基础上,子分类还可以拥有子分类,这样就构成了无限极分类. 接下来看具体实现的代码: 一.在控制器中按字段查询,查询出所有分类 ...

  2. Linux TC 流量控制与排队规则 qdisc 树型结构详解(以HTB和RED为例)

    1. 背景 Linux 操作系统中的流量控制器 TC (Traffic Control) 用于Linux内核的流量控制,它规定建立处理数据包的队列,并定义队列中的数据包被发送的方式,从而实现对流量的控 ...

  3. dtree和jquery构建树型结构

    对于小型的树型应用来说,dtree是一个不错的选择. 先看一眼dtree给的例子 构造静态树 首先引入css文件和js文件 <link rel="StyleSheet" hr ...

  4. 【唠叨两句】如何将一张树型结构的Excel表格中的数据导入到多张数据库表中...

    小弟昨天遇到一个相对比较棘手的问题,就像标题说的那样.如何将一张树型结构的Excel表格中的数据导入到多张数据库表中,在现实中实际是七张数据库表,这七张表之间有着有着相对比较复杂的主外键关系,对于我这 ...

  5. EF架构~单表一对多集合的插入(树型结构)

    单表一对多关系很常见,它是一种树形结构,如系统菜单表,部门表,分类表,这些都可以做成单表一对多关系,而这些表做成一对多关系后,如果通过EntityFramework进行插入操作时,会很方便,EF会自动 ...

  6. C#实现树型结构TreeView节点拖拽的简单功能,附全部源码,供有需要的参考

    为什么80%的码农都做不了架构师?>>>    应用软件是否好用就体现在一些细节操作上,开发人员是否考虑到了很多细节,例如一个树形结构的数据若不支持拖拽功能那用起来会很糟糕一些,用户 ...

  7. go之树型结构深度理解补充

    go之树型结构深度理解补充 在上一篇中借用了 Ilija Eftimov 文章来讲解了tree的定义和一些方法.这篇文章主要是讲解在树型结构中如何判断节点与节点之间的关系. A节点是否是B节点的直接上 ...

  8. Nestable 可移动拖拽的树型结构的使用(jQuery)

    利用jQuery可以制作出很好的树型结构.这里介绍一款最近才找到使用的Nestable 可以拖动.  网页中的效果 http://dbushell.github.com/Nestable/ 具体详细介 ...

  9. mysql 转成树_Mysql树型结构2种方式及相互转换

    Mysql实现树型结构,数据库上常见有2种方式:领接表.预排序遍历树(MPTT). 领接表方式-- 主要依赖于一个 parent 字段,用于指向上级节点,将相邻的上下级节点连接起来,id 为自动递增自 ...

  10. php删除树结构文件,树型结构列出目录中所有文件的php代码

    以树型结构列出指定目录里的所有文件,这样的话,目录下的所有文件便结构清晰的呈现在你的面前,有什么文件你一看便知,很方便的哦. 示例, php; auto-links:false;"> ...

最新文章

  1. 3天我把DDD业务领域建模、数据库、聚合彻底撸干净了!
  2. 剑指offer 算法 (举例让抽象具体化)
  3. java azure blob 查询_快速入门:适用于 Java 的 Azure Blob 存储客户端库 v8 | Microsoft Docs...
  4. 给一个元素插入一段HTML
  5. Docker 面临的安全隐患,我们该如何应对
  6. win8安装python3后不能编程_Win8.1 64位系统,python3.4 肿么安装gevent成功后不能用
  7. 用友php漏洞,用友CRM注入漏洞(无需登录通杀所有版本)
  8. linux系统进程类型不包括,linux期末考试练习题
  9. 随想录(qemu仿真linux kernel)
  10. 萤火商城V2.0开源版[uni-app端],轻量级前后端分离的电商系统,支持微信小程序 + H5+ 公众号 + APP
  11. 深度学习:从2D卷积到3D卷积的简单理解
  12. Java中的CAS(compare and swap)
  13. Oh my God, 连jQuery都放弃IE了!
  14. 通过抓包获取内涵段子的接口
  15. 【扔掉计算器】数学心算法《超棒超快》
  16. java 开发swt_一个java swt桌面程序开发到打包的总结(1)(收集)
  17. XT800刷机图示傻瓜教程
  18. 06.Logistic回归与最大熵模型(学习笔记)
  19. GeoServer发布高清卫星瓦片影像数据
  20. 通过Spring来读取文件的各种方法

热门文章

  1. Jmeter-配置元件
  2. POJ 3581:Sequence(后缀数组)
  3. highcharts饼图
  4. 巧妙使用JQuery Clone 添加多行数据,并更新到数据库的实现代码
  5. 视图控制器的View创建方式
  6. php工程师各大公司要求
  7. 【译】成为明星数据科学家的13大技能
  8. 统计月读(2019年5月)
  9. MatchingFrontier包简介及R实现
  10. Tomcat--安装与部署(一)