.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, "—", "—");

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

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

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

最新文章

  1. 【前端攻略】:玩转图片Base64编码
  2. tornado中将cookie值设置为json字符串
  3. SQL图形化操作设置级联更新和删除
  4. CGI、FastCGI和PHP-FPM关系图解
  5. IIS 浏览aspx页面出现 无法显示 XML 页
  6. [MEAN+ Webstrom] First API -- 2.Debug Node.js RESTful application
  7. ASP流程控制语句
  8. Leetcode-Read N Characters Given Read4 II
  9. Android学习之-TextView的滑动效果
  10. ionic(一) build你的第一个android apk
  11. CSS伪类选择器和伪元素选择器
  12. 将Apache添加为Linux的服务 实现自启动(转)
  13. 轻量级C语言实现的minixml解析库入门教程
  14. (笔记):组合and继承之访问限制(一)
  15. python类特列方法使用
  16. 生成二维码、条形码、带logo的二维码
  17. kibana升级之后原本保存的数据dashboards, visualizations, index patterns丢失
  18. 食物链--poj1182(并查集含有关系)
  19. ThinkJava-持有对象
  20. **测试某系统切换成docker部署之后性能的下降情况**

热门文章

  1. netty集群(一)-服务注册发现
  2. jenkins环境安装(windows)
  3. [LOJ#500]「LibreOJ β Round」ZQC的拼图
  4. .Net Core微服务入门全纪录(二)——Consul-服务注册与发现(上)
  5. Hexo博客框架攻略
  6. LR字符串处理函数-lr_eval_string
  7. if test表达式逻辑判断不能用&amp;&amp;
  8. usb串口的作用以及JLINK
  9. Python按顺序读取文件夹中文件
  10. 我要穿越,干翻 “烂语言” JavaScript!