C#实现无限级联下拉列表框
本文实例为大家分享了无限级联下拉列表框的的实现方法,具体内容如下
可能有一个树型结构的表,它可能有ID,Name,ParentID,Level等字段,下面要实现的就是从一级节点开始,一级一级的列出来,并以
下拉列表框的形式体现出来,就像是N级联动。
效果图:
两个问题:
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#教程
下一篇:C#简单邮件群发通用类
本文标题:C#实现无限级联下拉列表框
本文地址:https://www.xiuzhanwang.com/a1/C_jiaocheng/6642.html
您可能感兴趣的文章
- 01-10C#实现txt定位指定行完整实例
- 01-10WinForm实现仿视频播放器左下角滚动新闻效果的方法
- 01-10C#实现清空回收站的方法
- 01-10C#实现读取注册表监控当前操作系统已安装软件变化的方法
- 01-10C#实现多线程下载文件的方法
- 01-10C#实现Winform中打开网页页面的方法
- 01-10C#实现远程关闭计算机或重启计算机的方法
- 01-10C#自定义签名章实现方法
- 01-10C#文件断点续传实现方法
- 01-10winform实现创建最前端窗体的方法
阅读排行
本栏相关
- 01-10C#通过反射获取当前工程中所有窗体并
- 01-10关于ASP网页无法打开的解决方案
- 01-10WinForm限制窗体不能移到屏幕外的方法
- 01-10WinForm绘制圆角的方法
- 01-10C#实现txt定位指定行完整实例
- 01-10WinForm实现仿视频播放器左下角滚动新
- 01-10C#停止线程的方法
- 01-10C#实现清空回收站的方法
- 01-10C#通过重写Panel改变边框颜色与宽度的
- 01-10C#实现读取注册表监控当前操作系统已
随机阅读
- 01-10使用C语言求解扑克牌的顺子及n个骰子
- 01-11Mac OSX 打开原生自带读写NTFS功能(图文
- 08-05dedecms(织梦)副栏目数量限制代码修改
- 01-10SublimeText编译C开发环境设置
- 08-05DEDE织梦data目录下的sessions文件夹有什
- 04-02jquery与jsp,用jquery
- 01-10C#中split用法实例总结
- 01-10delphi制作wav文件的方法
- 08-05织梦dedecms什么时候用栏目交叉功能?
- 01-11ajax实现页面的局部加载