.NET下拉框DropDownList层级实现

    这也算是第一篇博客吧,技术比较菜,写得不好,希望各位博友见谅哈,多多提提意见。

    今天做电商网站新闻添加的时候,下拉框选择新闻类别觉得太长,又无法定位其准确级别,让人甚是苦恼,于是想做一个层级的下拉框,刚开始的时候想到了用递归树去实现,之前写过递归树,觉得应该可以,便试了一下,递归树代码如下:

 #region 递归添加下拉框的值 参数ParentID为树的最大父结点
public void AddTree(int ParentID, ListItem pNode)
{
//过滤ParentID,得到当前的所有子节点 ParentID为父节点ID
(this.ViewState["DataView_Tree"] as DataTable).DefaultView.RowFilter = "[ParMenuListId] = " + ParentID; //循环递归
foreach (DataRowView Row in (this.ViewState["DataView_Tree"] as DataTable).DefaultView)
{
//声明节点
ListItem li = new ListItem();
if (pNode == null)
{
//添加根节点
li.Text = Row["MenuListName"].ToString();
li.Value = Row["MenuListId"].ToString();
ddlParMenu.Items.Add(li);
AddTree(Int32.Parse(Row["MenuListId"].ToString()), li); //递归
}
else
{
//添加当前节点的子节点
li.Text = "├—" + Row["MenuListName"].ToString();
li.Value = Row["MenuListId"].ToString();
ddlParMenu.Items.Add(li);
AddTree(Int32.Parse(Row["MenuListId"].ToString()), li); //递归
}
}
}
#endregion

注释已经写的很清楚了,不用我多说了吧,调用方法如下:

this.ViewState["DataView_Tree"] = DbHelperSQL.Query(@"select MenuListId,ParMenuListId,MenuListName from RY_MenuList").Tables[];//屏蔽快速通道设置
AddTree(, (ListItem)null);

运行结果,确实可以出来,运行结果如图所示:

  我在数据库再加一列之后,加载测试全新2节点下,显示

可以看到,虽然测试权限2在测试权限3下,但是依旧会出现和他同级的情况,查看代码可知:

//声明节点
ListItem li = new ListItem();
if (pNode == null)
{
//添加根节点
li.Text = Row["MenuListName"].ToString();
li.Value = Row["MenuListId"].ToString();
ddlParMenu.Items.Add(li);
AddTree(Int32.Parse(Row["MenuListId"].ToString()), li); //递归
}
else
{
//添加当前节点的子节点
li.Text = "├—" + Row["MenuListName"].ToString();
li.Value = Row["MenuListId"].ToString();
ddlParMenu.Items.Add(li);
AddTree(Int32.Parse(Row["MenuListId"].ToString()), li); //递归
}

参考上面递归代码不难看出,根节点加载没有问题,但是子节点,加载永远只有else,就是说,不管多少级,都走else,不会延伸出别的,想过通过定义级别来实现,但又要用到swicth来实现,太多的话,反而实现不了,扩展性不好,于是,网上找了一下资料,用了也是递归方式,跟这个也差不多,代码如下:

/// <summary>
/// 绑定下拉框(分层级)
/// </summary>
/// <param name="dt">绑定的数据源</param>
/// <param name="parentId">上一级的ID名称(数据列名称)</param>
/// <param name="colId">下拉框值</param>
/// <param name="colName">下拉框显示文本</param>
/// <param name="drs">顶级集合</param>
/// <param name="ddl">下拉框ID</param>
/// <param name="leveStr">层级的前缀</param>
/// <param name="nextStr">多层级的前缀</param>
protected void GetChild(DataTable dt, string parentId, string colId, string colName, DataRow[] drs, DropDownList ddl, string leveStr, string nextStr)
{
foreach (DataRow dr in drs)
{
string txt = dr[colName].ToString();
if (leveStr.Length != )
{
txt = leveStr + dr[colName].ToString();
}
ddl.Items.Add(new ListItem(txt, dr[colId].ToString()));
DataRow[] cdrs = dt.Select("ParMenuListId="+dr[colId]);
if (cdrs.Length != )
{
string nextLevelStr = leveStr.Insert(, nextStr);
//string nextLevelStr = leveStr.Insert(0, "├");
GetChild(dt, parentId, colId, colName, cdrs, ddl, nextLevelStr, nextStr);
}
}
}

这段代码调用方法:

DataTable dt = DbHelperSQL.Query("select MenuListId,ParMenuListId,MenuListName from RY_MenuList").Tables[];
DataRow[] dr = dt.Select("ParMenuListId=0");
GetChild(dt, "", "MenuListId", "MenuListName", dr, ddlParMenu, "—", "—");

完成之后,运行结果如图所示:

此处实现了多层级的表现方式,满足需求,可以无限级,至于前缀可以更改的。

致辞,多层级下拉框已经完毕,欢迎各位博友点评。

递归实现DropDownList层级的更多相关文章

  1. goroutine 加 channel 代替递归调用,突破递归调用的层级限制

    package main import ( "fmt" "github.com/davecgh/go-spew/spew" "github.com/B ...

  2. 数据库的小案例(三):用递归实现TreeView层级显示

    从这个小案例我学到了不少知识.这些无论如何无法从书里得来.正所谓实践出真知,学习编程需要大量实践这句话永不过时. 首先:好的代码和坏的代码带来的性能上的差异很明显.好的策略可以让你的程序运行速度大大加 ...

  3. c#通用递归生成无限层级树

    NewsType结构: Id ParentId Name children(List<NewsType>) public void LoopToAppendChildren(List< ...

  4. json list数据递归生成树状层级JSON

    <!DOCTYPE html> <html> <head> <script> var data=[ {"id":"aaa& ...

  5. js list数据 转 树状 层级 JSON,递归生成树状 层级 JSON

    <!DOCTYPE html> <html> <head> <script> var data=[ {"id":"aaa& ...

  6. PHP使用递归按层级查找数据

    今天主要介绍一下使用递归来按层级查找数据.原理挺简单的,主要是通过父级id一级一级的循环查找子级,使用PHP循环代码也很容易实现,不过如果层级越多,PHP重复代码也越多,这时可以使用递归来实现这功能. ...

  7. SQL Server中CTE的另一种递归方式-从底层向上递归

        SQL Server中的公共表表达式(Common Table Expression,CTE)提供了一种便利的方式使得我们进行递归查询.所谓递归查询方便对某个表进行不断的递归从而更加容易的获得 ...

  8. JavaEE基础(二十三)/递归

    1.File类递归练习(统计该文件夹大小) 需求:1,从键盘接收一个文件夹路径,统计该文件夹大小 2.File类递归练习(删除该文件夹) 需求:2,从键盘接收一个文件夹路径,删除该文件夹 3.File ...

  9. 菜鸟笔记:node.js+mysql中将JSON数据构建为树(递归制作树状菜单数据接口)

    初学Web端开发,今天是第一次将所学做随笔记录,肯定存在多处欠妥,望大家海涵:若有不足,望大家批评指正. 进实验室后分配到的第一个项目,需要制作一个不确定层级树形菜单的数据接口,对于从来没实战编过程的 ...

随机推荐

  1. 详解CurrentHashMap之预习篇

    CurrentHashMap的出现时为了解决HashMap的高并发导致OOM的缺陷,并且能够保证高性能读取.那么解读CurrentHashMap需要具备哪些知识的呢? HashMap 解读 Java ...

  2. 面试:在面试中关于List(ArrayList、LinkedList)集合会怎么问呢?你该如何回答呢?

    前言 在一开始基础面的时候,很多面试官可能会问List集合一些基础知识,比如: ArrayList默认大小是多少,是如何扩容的? ArrayList和LinkedList的底层数据结构是什么? Arr ...

  3. NativeXml实例训练时注意事项_1

    NativeXml实例训练: 1)使用NativeXml操作xml文件时,需要将几个单元文件在Library中引用,配置好这个后面的就可自由训练.或按照自己想要的组合折腾.       2)运行程序调 ...

  4. 密码学数论基础部分总结之 有限域GF(p) Galois Fields

    今天花了一下午的时间学习密码学的数论部分,下面将学到的内容进行一下总结,也算是加深记忆.我本身对密码学这方面比较感兴趣,而且本节出现了许多数学公式,使用刚刚学习的LaTex公式来呈现出来,练习练习,何 ...

  5. SpringBoot整合Hibernate Validator实现参数验证功能

    在前后端分离的开发模式中,后端对前端传入的参数的校验成了必不可少的一个环节.但是在多参数的情况下,在controller层加上参数验证,会显得特别臃肿,并且会有许多的重复代码.这里可以引用Hibern ...

  6. c++ UDP套接字服务器端代码示范

    c++ UDP套接字服务器端代码示范 #include<winsock2.h> //包含头文件 #include<stdio.h> #include<windows.h& ...

  7. 重学 Java 设计模式:实战命令模式「模拟高档餐厅八大菜系,小二点单厨师烹饪场景」

    作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 持之以恒的重要性 初学编程往往都很懵,几乎在学习的过程中会遇到 ...

  8. Unable to resolve dependency for ':app@debug/compileClasspath': Could not find any version that matc

    错误展示: 错误提示: Unable to resolve dependency for ':app@debug/compileClasspath': Could not find any versi ...

  9. vue学习第二天:Vue跑马灯效果制作

    分析: 1. 给开始按钮绑定一个点击事件 2.在按钮的事件处理函数中,写相关的业务代码 3.拿到msg字符串 4.调用字符串的substring来进行字符串的截取操作 5.重新赋值利用vm实例的特性来 ...

  10. 黎活明8天快速掌握android视频教程--20_采用ContentProvider对外共享数据

    1.内容提供者是让当前的app的数据可以让其他应用访问,其他应该可以通过内容提供者访问当前app的数据库 contentProvider的主要目的是提供一个开发的接口,让其他的应该能够访问当前应用的数 ...