C#实现无限级联下拉列表框

作者:lijiao 时间:2023-08-30 22:57:22 

本文实例为大家分享了无限级联下拉列表框的的实现方法,具体内容如下

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

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

效果图:

C#实现无限级联下拉列表框

两个问题:

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

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

实现:

JS代码


<script type="text/javascript">
 function areaOnSelect(obj) {
   var res = '';
   $.ajax({ url: '@Url.Action("GetSubTree")',
     type: 'GET',
     data: { parentId: obj.value },
     success: function (msg) {
       $(obj).nextAll().remove();
       res = "<select name='Sub' onchange='areaOnSelect(this)'>";
       res += "<option value=''>请选择</option>";
       $.each(msg, function (i, item) {
         res += "<option value='" + item["ID"] + "'>" + item["Name"] + "</option>";
       });
       res += "</select>";
       if ($(res).find("option").size() > 1)
         $(obj).after(res);
     }
   });
 }
</script>

C#代码:


#region 树型结构相关
   /// <summary>
   /// 递归找老祖宗
   /// </summary>
   /// <param name="father"></param>
   void GetFather(SubItem father)
   {
     if (father != null)
     {
       father.Parent = _subList.FirstOrDefault(i => i.ID == father.ParentID);
       GetFather(father.Parent);
     }
   }

/// <summary>
   /// 弟妹找子孙
   /// </summary>
   /// <param name="father">父对象</param>
   void getSons(SubItem father)
   {
     if (father != null)
     {
       father.Sons = _subList.Where(item =>
         item.ParentID.Equals(father.ID)).ToList();
       father.Sons.ForEach(item =>
       {
         item.Parent = father;
         getSons(item);
       });
     }
   }

#endregion

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


/// <summary>
   /// 递归得到它的所有祖宗以selectlist的形式进行拼接
   /// </summary>
   /// <param name="son"></param>
   /// <param name="sbr"></param>
   void getSelectList(SubItem son, StringBuilder sbr)
   {
     StringBuilder inSbr = new StringBuilder();
     if (son != null)
     {
       if (son.ParentID == 0)
         inSbr.Append("<select name='Parent' onchange = 'areaOnSelect(this)' >");
       else
         inSbr.Append("<select name='Sub'>");
       GetCommon_CategoryByLevel(son.Level).ToList().ForEach(i =>
       {
         if (i.ID == son.ID)
           inSbr.Append("<option value='" + i.ID + "' selected='true'>" + i.Name + "</option>");
         else
           inSbr.Append("<option value='" + i.ID + "'>" + i.Name + "</option>");
       });

inSbr.Append("</select>");
       sbr.Insert(0, inSbr);
       getSelectList(son.Parent, sbr);
     }
   }

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


/// <summary>
   /// 得到指定深度的列表
   /// </summary>
   /// <param name="level"></param>
   /// <returns></returns>
   public List<SubItem> GetCommon_CategoryByLevel(int level)
   {
     var linq = from data1 in _subList
           join data2 in _subList on data1.ParentID equals data2.ID into list
           select new SubItem
           {
             ID = data1.ID,
             Level = data1.Level,
             Name = data1.Name,
             Parent = list.FirstOrDefault(),
             ParentID = data1.ParentID,
           };
     return linq.Where(i => i.Level.Equals(level)).ToList();
   }

MVC页面action相关:


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

MVC页面代码相关:


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

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


/// <summary>
 /// 树型分类结构
 /// </summary>
 public class Category
 {
   /// <summary>
   /// 父ID
   /// </summary>
   public int ParentID { get; set; }
   /// <summary>
   /// 树ID
   /// </summary>
   public int ID { get; set; }
   /// <summary>
   /// 树名称
   /// </summary>
   public string Name { get; set; }
   /// <summary>
   /// 深度
   /// </summary>
   public int Level { get; set; }
   /// <summary>
   /// 子孙节点
   /// </summary>
   public List<Category> Sons { get; set; }
   /// <summary>
   /// 父节点
   /// </summary>
   public Category Parent { get; set; }
 }

好了,现在我们的N级无限下拉列表框就做好了,感谢大家的阅读。

标签:C#,无限级联,下拉列表
0
投稿

猜你喜欢

  • Mybatis如何解决sql中like通配符模糊匹配问题

    2023-12-22 19:39:52
  • 用C#编写ActiveX控件(三)

    2023-03-26 12:35:10
  • C#中DataSet、DataTable、DataRow数据的复制方法

    2021-10-26 20:10:31
  • Android RecyclerView的简单使用

    2022-08-07 22:04:23
  • android如何获取联系人所有信息

    2021-10-24 13:24:41
  • 基于Mybatis-plus实现多租户架构的全过程

    2023-08-03 02:10:57
  • Spring + Mybatis 项目实现动态切换数据源实例详解

    2022-01-13 04:34:41
  • C# 泛型List排序的实现

    2021-09-22 07:03:16
  • 详解springboot集成mybatis xml方式

    2022-08-05 09:04:54
  • 快速了解Java中ThreadLocal类

    2021-06-28 03:32:20
  • Android稳定性:可远程配置化的Looper兜底框架

    2022-02-18 09:02:23
  • c# 删除所有的空文件夹的小例子

    2023-09-10 06:53:44
  • c#基础系列之ref和out的深入理解

    2023-05-20 10:51:50
  • C#怎样实现文件下载断点续传

    2023-02-23 19:11:41
  • 使用java编程从0到1实现一个简单计算器

    2023-12-06 04:47:53
  • Java实现树形List与扁平List互转的示例代码

    2023-03-15 00:18:23
  • java swing 创建一个简单的QQ界面教程

    2022-09-08 06:51:39
  • Android自定义scrollview实现回弹效果

    2023-12-15 08:42:47
  • Spring Boot和Thymeleaf整合结合JPA实现分页效果(实例代码)

    2023-11-25 07:05:15
  • Spring Boot 实现配置文件加解密原理

    2023-11-23 17:48:46
  • asp之家 软件编程 m.aspxhome.com