.NET下拉框DropDownList层级实现

                    .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 else
21 {
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来实现,太多的话,反而实现不了,扩展性不好,于是,网上找了一下资料,用了也是递归方式,跟这个也差不多,代码如下:


/// <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 != 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, "—", "—");

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

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

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

.NET下拉框DropDownList层级实现,码迷,mamicode.com

时间: 2024-08-07 08:40:06

.NET下拉框DropDownList层级实现的相关文章

Jquery操作下拉框(DropDownList)实现取值赋值

Jquery操作下拉框(DropDownList)想必大家都有所接触吧,下面与大家分享下对DropDownList进行取值赋值的实现代码 1. 获取选中项: 获取选中项的Value值: $('select#sel option:selected').val(); 或者 $('select#sel').find('option:selected').val(); 获取选中项的Text值: $('select#seloption:selected').text(); 或者 $('select#sel

GridView 中绑定DropDownList ,下拉框默认选中Label的值

在GridView中,我们 有时候要绑定值. 前台绑定的代码可以这样 <asp:TemplateField HeaderText="当前状态" ItemStyle-HorizontalAlign="Center"> <EditItemTemplate> <asp:DropDownList ID="dStatus" DataSource='<%#BindStatus()%>' DataTextField=&

MVC 中的@Html.DropDownList下拉框的使用

MVC 中的下拉框 实现方式,下面为大家介绍一个我自己认为比较好用的实现方式,而二话不说直接上代码: 第一步: 后台代码 //公共的方法 //在每次需要展示下拉框的时候,需要调用一下这个方法 [数据源是DB数据库] private void _ProductExtensions( BtDbContext _ctx ) { #region 商品分类 List<SelectListItem> listProductTypes = new List<SelectListItem>();

mvc SelectList 给下拉框 @Html.DropDownList绑定值

后台代码: public class DropController : Controller { // GET: Drop public ActionResult Index() { List<Province> list = new List<Province> { new Province{ Id=1,name="山西省"}, new Province{ Id=1,name="广东省"}, new Province{ Id=1,name=

C#中的ComboBox实现只能选择不能输入,且下拉框中有默认值。

下拉框有DropDownStyle这一属性,把DropDownStyle类型选为DropDownList,则下拉框只能选择不能输入了.但是这时的下拉框是没有默认值的,即使在Text属性中输入默认值,也不起作用.就要在(某某某.Designer.cs)文件中修改.这是没有修改的:this.NameTemplateBox.Cursor = System.Windows.Forms.Cursors.Default; this.NameTemplateBox.DropDownStyle = System

基于bootstrap-multiselect.js的下拉框联动

背景:当option特别多时,一般的下拉框选择起来就有点力不从心了,所以使用multiselect是个很好的选择,可以通过输入文字来选择选项很方便,但是有一个需要下拉框联动,网上找了半天才找到解决方法,在此分享一下 1.先引入 <script src="~/Assets/js/bootstrap-multiselect.min.js"></script> <link href="~/Assets/css/bootstrap-multiselect

selenium自学笔记---下拉框定位元素select

下拉框1.先定位select 然后在定位option city = driver.find_element_by_id("selCities_0") city.find_element_by_xpath("//option[@value='50']").click() 或者 driver.find_element_by_id("selCities_0").find_element_by_xpath("//option[@value='5

mvc 下拉框赋值

以前使用WebForm变成时,下拉框传值只需直接在后台绑定代码就可以了.现在我们来看看在MVC中DropDownList是如果和接受从Controller传过来的值的. 第一种:使用DropDownList 控制器代码: public ActionResult Index() { //1.1查询YzSeriesEntity的数据 List<Model.YzSeriesEntity> seriesList = seriesBLL.LoadEnities().ToList(); //1.2将YzS

模拟下拉框

//模拟下拉框$(".Js_dropMod").each(function(){        var _this=$(this)            //_this.find(".Js_hiddenVal").val("")            var curObj=_this.find(".Js_curVal");            if(curObj.find("input:text").le