博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
递归实现DropDownList层级
阅读量:5213 次
发布时间:2019-06-14

本文共 4115 字,大约阅读时间需要 13 分钟。

                    .NET下拉框DropDownList层级实现

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

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

1 #region 递归添加下拉框的值 参数ParentID为树的最大父结点 2         public void AddTree(int ParentID, ListItem pNode) 3         { 4             //过滤ParentID,得到当前的所有子节点 ParentID为父节点ID 5             (this.ViewState["DataView_Tree"] as DataTable).DefaultView.RowFilter = "[ParMenuListId] = " + ParentID; 6  7             //循环递归 8             foreach (DataRowView Row in (this.ViewState["DataView_Tree"] as DataTable).DefaultView) 9             {10                 //声明节点11                 ListItem li = new ListItem();12                 if (pNode == null)13                 {14                     //添加根节点15                     li.Text = Row["MenuListName"].ToString();16                     li.Value = Row["MenuListId"].ToString();17                     ddlParMenu.Items.Add(li);18                     AddTree(Int32.Parse(Row["MenuListId"].ToString()), li);    //递归19                 }20                 else21                 {22                     //添加当前节点的子节点23                     li.Text = "├—" + Row["MenuListName"].ToString();24                     li.Value = Row["MenuListId"].ToString();25                     ddlParMenu.Items.Add(li);26                     AddTree(Int32.Parse(Row["MenuListId"].ToString()), li);     //递归27                 }28             }29         }30         #endregion

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

this.ViewState["DataView_Tree"] = DbHelperSQL.Query(@"select MenuListId,ParMenuListId,MenuListName from RY_MenuList").Tables[0];//屏蔽快速通道设置                AddTree(0, (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来实现,太多的话,反而实现不了,扩展性不好,于是,网上找了一下资料,用了也是递归方式,跟这个也差不多,代码如下:

///         /// 绑定下拉框(分层级)        ///         /// 绑定的数据源        /// 上一级的ID名称(数据列名称)        /// 下拉框值        /// 下拉框显示文本        /// 顶级集合        /// 下拉框ID        /// 层级的前缀        /// 多层级的前缀        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 != 1)                {                    txt = leveStr + dr[colName].ToString();                }                ddl.Items.Add(new ListItem(txt, dr[colId].ToString()));                DataRow[] cdrs = dt.Select("ParMenuListId="+dr[colId]);                if (cdrs.Length != 0)                {                    string nextLevelStr = leveStr.Insert(0, 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[0];                DataRow[] dr = dt.Select("ParMenuListId=0");                GetChild(dt, "0", "MenuListId", "MenuListName", dr, ddlParMenu, "—", "—");

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

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

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

转载于:https://www.cnblogs.com/yangleikingly/p/King.html

你可能感兴趣的文章
个人作业4-alpha阶段个人总结
查看>>
android smack MultiUserChat.getHostedRooms( NullPointerException)
查看>>
递归-下楼梯
查看>>
实用的VMware虚拟机使用技巧十一例
查看>>
监控工具之---Prometheus 安装详解(三)
查看>>
Azure Iaas基础之---创建虚拟机
查看>>
不错的MVC文章
查看>>
网络管理相关函数
查看>>
IOS Google语音识别更新啦!!!
查看>>
20190422 T-SQL 触发器
查看>>
[置顶] Linux终端中使用上一命令减少键盘输入
查看>>
poj1422_有向图最小路径覆盖数
查看>>
BootScrap
查看>>
[大牛翻译系列]Hadoop(16)MapReduce 性能调优:优化数据序列化
查看>>
WEB_点击一百万次
查看>>
CodeForces - 878A Short Program(位运算)
查看>>
路冉的JavaScript学习笔记-2015年1月23日
查看>>
Mysql出现(10061)错误提示的暴力解决办法
查看>>
2018-2019-2 网络对抗技术 20165202 Exp3 免杀原理与实践
查看>>
NPM慢怎么办 - nrm切换资源镜像
查看>>