C#实现无限级联下拉列表框
作者:lijiao 发布时间:2023-08-30 22:57:22
标签: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级无限下拉列表框就做好了,感谢大家的阅读。


猜你喜欢
- Nacos获取不到配置的值namespace设计真实一个奇特的东西。用spring-cloud-starter-alibaba-nacos-
- 背景最近好几个项目在运行过程中客户都提出文件上传大小的限制能否设置的大一些,用户经常需要上传好几个G的资料文件,如图纸,视频等,并且需要在上
- 本文实例讲述了Android编程中context及全局变量的用法。分享给大家供大家参考,具体如下:今天在研究context的时候,对appl
- 什么是AppWidget?AppWidget就是我们平常在桌面上见到的那种一个个的小窗口,利用这个小窗口可以给用户提供一些方便快捷的操作。
- 本文实例讲述了Android实现固定屏幕显示的方法。分享给大家供大家参考。具体如下:在Android开发中我们会碰到开发屏幕扭转的情况,如何
- 有时我们可能会遇到下图这样一种情况 — 我们需要的资料或教程被分成了几部分存放在多个PDF文件中,不管是阅读还是保存都不是很方便,这时我们肯
- 1、锁优化在JDK6之前,通过synchronized来实现同步效率是很低的,被synchronized包裹的代码块经过javac编译后,会
- Java内部类(Inner Class),类似的概念在C++里也有,那就是嵌套类(Nested Class),乍看上去内部类似乎有些多余,它
- java 8的新特性之一就是lambda表达式,parallelStream()都说性能会比较高,现一探究竟。话不多说,上代码: @Test
- design包的出现,Android界面发生了巨大变化,各种滑动配合的效果,下面我就粘性滑动中的一种进行自定义,效果图如下: 大家看到效果了
- 在Android中要让一个程序的界面始终保持一个方向,不随手机方向转动而变化的办法: 只要在AndroidManifest.xml里面配置一
- RestTemplate 是由 Spring 提供的一个 HTTP 请求工具,它提供了常见的REST请求方案的模版,例如 GET 请求、PO
- 协程(Coroutine)这个词其实有很多叫法,比如有的人喜欢称为纤程(Fiber),或者绿色线程(GreenThread)。其实究其本质,
- jar包打包实现jar包打包可以使用jar指令实现打包,在命令行中输入jar可以查看jar指令的内容 从最后显示的两个示例看出存在两种打包的
- 一.static关键字使用场景static关键字主要有以下5个使用场景:1.1、静态变量把一个变量声明为静态变量通常基于以下三个目的:作为共
- 引言现在APP开发集成分享功能已经是非常普遍的需求了。其他集成分享技术我没有使用过,今天我就来介绍下使用ShareSDK来进行分享功能开发的
- 一.前言RabbitMQ的TTL全称为Time-To-Live,表示的是消息的有效期。消息如果在队列中一直没有被消费并且存在时间超过了TTL
- Android实现TextView超链接一共有五种方式:推荐第四种、第五种1. 直接在xml文件中配置autoLink属性(简单易用,效果单
- 首先介绍一下Java解释器的概念,Java解释器:解释器是Java虚拟机非常重要的一部分,它的工作就是把字节码转化为机器码并在特定的平台进行
- Lambda,希腊字母λ,在C#编程语言中,被引入为Lambda表达式,表示为匿名函数(匿名方法)。编程时离不开函数,