zoukankan      html  css  js  c++  java
  • 递归实现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, "", "");

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

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

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

  • 相关阅读:
    小程序云函数 Error: errCode: -404011 cloud function execution error
    Fiddler+雷电模拟器进行APP抓包
    Vue优化常用技巧
    sftp常用命令整理
    React生命周期学习整理
    git 提交跳过检查
    漂亮的代码系列
    关于我系列
    架构系列
    深度学习系列
  • 原文地址:https://www.cnblogs.com/yangleikingly/p/King.html
Copyright © 2011-2022 走看看