带线的无限级下拉树列表

简介:

好多年没写文章了
这里就分享点自己原创的一点破代码,效果如图下:

本人的提供的代码如下:

using System;
using System.Collections.Generic;
using System.Text;
using System.Web.UI.WebControls;

namespace Interface.Common
{
    public interface IDropDownTree : IDisposable
    {
        /// <summary>
        
/// 返回Dictionary里分别对应ID,文本,如果没有子节点返回null
        
/// </summary>
        
/// <param name="parentID">父节点ID</param>
        
/// <returns></returns>

        Dictionary<stringstring> GetChildCategory(string parentID);
        /// <summary>
        
/// 代码里写return new Interface.Common.DropDownTree(this);
        
/// </summary>

        DropDownTree DropDownTree
        {
            get;
        }

    }

    public sealed class DropDownTree
    {
        IDropDownTree _DropDownTree;
        public DropDownTree(IDropDownTree dropDownTree)
        {
            _DropDownTree = dropDownTree;
        }

        /// <summary>
        
/// 用于树的前缀
        
/// </summary>
        
/// <param name="IsLast">是否是同级节点中的最后一个</param>
        
/// <param name="HasChild">本节点是否拥有子节点</param>
        
/// <param name="ParentString">父节点前缀符号</param>
        
/// <returns>本节点的前缀</returns>

        private string GetPreFix(bool isLast, bool hasChild, string parentString)
        {
            string result = string.Empty;
            if (!string.IsNullOrEmpty(parentString))
            {
                parentString = parentString.Remove(parentString.Length - 1).Replace("""").Replace(""" ");
                result += parentString;
            }

            if (isLast)
            {
                result += "";
            }

            else
            {
                result += "";
            }

            if (hasChild)
            {
                result += "";
            }

            else
            {
                result += "";
            }

            return result;
        }

        #region 绑定下拉菜单

        /// <summary>
        
/// 绑定连动级的下拉菜单
        
/// </summary>
        
/// <param name="ddlGoodsType">传进一个被绑定的DropDownList</param>
        
/// <param name="removeID">被排除绑定的节点ID</param>
        
/// <param name="AutoDispose">是否自动释放</param>

        public void BindToDropDownList(DropDownList ddlGoodsType, string removeID,string parentID, bool autoDispose)
        {
            if (ddlGoodsType != null)
            {
                ListItem listItem = null;
                string currentID = parentID;//根节点/父ID
                string currentSign = string.Empty;//当前节点符号;
                string parrentSign = string.Empty; //父节点符号;
                bool HasChild = true;//是否有子
                Queue<string> parentKeyList = new Queue<string>();//存 有子节点的 节点ID
                Queue<string> parentSignList = new Queue<string>();//对应节点ID的前缀符号
                int itemIndexOf = 0;//父节点所在的位置 
                while (HasChild)
                {
                    int lastOneCount = 1;//用于计算在同级别中是否最后一个
                    Dictionary<stringstring> childList = _DropDownTree.GetChildCategory(currentID);// 得到子节点列表
                    if (childList != null && childList.Count > 0)
                    {
                        if (!string.IsNullOrEmpty(removeID) && childList.ContainsKey(removeID))
                        {
                            childList.Remove(removeID);
                        }

                        foreach (KeyValuePair<stringstring> entry in childList)
                        {
                            if (_DropDownTree.GetChildCategory(entry.Key) != null)//存在子
                            {
                                currentSign = GetPreFix(lastOneCount == childList.Count, true, parrentSign);
                                listItem = new ListItem(currentSign + entry.Value, entry.Key);

                                parentKeyList.Enqueue(entry.Key);//当前的节点ID
                                parentSignList.Enqueue(currentSign);//当前的节点符号
                            }

                            else//不存在子
                            {
                                currentSign = GetPreFix(lastOneCount == childList.Count, false, parrentSign);
                                listItem = new ListItem(currentSign + entry.Value, entry.Key);
                            }

                            if (ddlGoodsType.Items.Count != 0)
                            {
                                itemIndexOf = string.IsNullOrEmpty(currentID) ? itemIndexOf + 1 : ddlGoodsType.Items.IndexOf(ddlGoodsType.Items.FindByValue(currentID)) + lastOneCount;
                            }

                            ddlGoodsType.Items.Insert(itemIndexOf, listItem);//添加子节点
                            lastOneCount++;
                        }

                        if (parentKeyList.Count > 0)//存在子节点时
                        {
                            currentID = parentKeyList.Dequeue();
                            parrentSign = parentSignList.Dequeue();
                        }

                        else
                        {
                            HasChild = false;
                        }

                    }

                    else
                    {
                        break;
                    }



                }

                if (autoDispose)
                {
                    _DropDownTree.Dispose();
                }


            }

        }

        /// <summary>
        
/// 绑定连动级的下拉菜单
        
/// </summary>
        
/// <param name="ddlGoodsType">传进一个被绑定的DropDownList</param>

        public void BindToDropDownList(DropDownList ddlGoodsType)
        {
            BindToDropDownList(ddlGoodsType, string.Empty,nulltrue);
        }

        /// <summary>
        
/// 绑定连动级的下拉菜单
        
/// </summary>
        
/// <param name="ddlGoodsType">传进一个被绑定的DropDownList</param>
        
/// <param name="removeID">被排除的ID</param>

        public void BindToDropDownList(DropDownList ddlGoodsType, string removeID)
        {
            BindToDropDownList(ddlGoodsType, removeID,nulltrue);
        }

        /// <summary>
        
/// 绑定连动级的下拉菜单
        
/// </summary>
        
/// <param name="ddlGoodsType">传进一个被绑定的DropDownList</param>
        
/// <param name="removeID">被排除的ID,若没有,传null</param>
        
/// <param name="parentID">起始父ID</param>

        public void BindToDropDownList(DropDownList ddlGoodsType, string removeID,string parentID)
        {
            BindToDropDownList(ddlGoodsType, removeID,parentID, true);
        }

        #endregion

    }

}


调用方法很简单:
1.继承自IDropDownTree接口
2.实现3个接口方法

实现接口代码示例[Dispose方法自己实现],最主要的是自己实现获得子级的方法
  #region IDropDownTree 成员

        public Dictionary<stringstring> GetChildCategory(string parentID)
        {
            string where = "ParentID='" + parentID + "'";
            if (string.IsNullOrEmpty(parentID))
            {
                where = "ParentID is null or ParentID='" + Guid.Empty + "'";
            }

            List<GoodsCategoryBean> _GoodsCategoryList = SelectList(0wherestring.Empty, false);
            if (_GoodsCategoryList != null && _GoodsCategoryList.Count > 0)
            {
                Dictionary<stringstring> categoryList = new Dictionary<stringstring>();
                for (int i = 0; i < _GoodsCategoryList.Count; i++)
                {
                    categoryList.Add(_GoodsCategoryList[i].ID.ToString(), _GoodsCategoryList[i].GategoryName);
                }

                return categoryList;
            }

            return null;
        }


        public Interface.Common.DropDownTree DropDownTree
        {
            get return new Interface.Common.DropDownTree(this); }
        }


        #endregion

页面调用代码: 类名.DropDownTree.BindToDropDownList(下拉控件ID);

希望对大伙有点帮助....
相关文章
|
4月前
|
开发框架 前端开发 JavaScript
使用DevExpress的GridControl实现多层级或无穷级的嵌套列表展示
使用DevExpress的GridControl实现多层级或无穷级的嵌套列表展示
|
5月前
|
JavaScript 前端开发
buildadmin实现多级关联下拉效果
buildadmin实现多级关联下拉效果
31 0
|
6月前
|
前端开发 JavaScript
如何处理用户的拖拽排序操作
这个示例展示了如何使用JavaScript处理HTML列表的拖拽排序。通过监听`dragstart`、`dragend`、`dragenter`、`dragleave`、`dragover`和`drop`事件,实现拖拽元素时的视觉反馈和元素位置交换。当用户拖放列表项时,相关事件触发,更新列表顺序,提供直观的交互体验。
|
6月前
【sgSearch】自定义组件:常用搜索栏筛选框组件(包括表格高度变化兼容)。
【sgSearch】自定义组件:常用搜索栏筛选框组件(包括表格高度变化兼容)。
|
人工智能 自然语言处理 语音技术
elementUI使用v-for创建无限级导航栏—— 递归组件
elementUI使用v-for创建无限级导航栏—— 递归组件
219 0
|
设计模式 人工智能 安全
没有性能瓶颈的无限级菜单树应该这样设计
以一门网络课程为例,我们设计一个课程的关系结构。比如,我们有Java入门课程、人工智能课程、Java设计模式、源码分析、软技能等,而Java设计模式、源码分析、软技能又属于Java架构师系列课程包,每个课程的定价都不一样。但是,这些课程不论怎么组合,都有一些共性,而且是整体和部分的关系,可以用组合模式来设计。首先创建一个顶层的抽象组件CourseComponent类。
92 0
html+css实战158-定位-显示层级
html+css实战158-定位-显示层级
146 0
html+css实战158-定位-显示层级
|
索引
好客租房148-渲染右侧索引列表(滚动城市列表高亮)
好客租房148-渲染右侧索引列表(滚动城市列表高亮)
116 0
好客租房148-渲染右侧索引列表(滚动城市列表高亮)
|
JavaScript 数据建模 数据格式
【自然框架】n级下拉列表框的原理
  其实原理也很简单,分成两个部分,一个是服务器端,一个是客户端。     首先要设置记录集,这里用DataSet来装载,二级联动,里面就要有两个DataTable;三级联动,里面就要有三个DataTable。
1208 0
下一篇
无影云桌面