带线的无限级下拉树列表

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

本人的提供的代码如下:

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<string, string> 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<string, string> childList = _DropDownTree.GetChildCategory(currentID);// 得到子节点列表
                    if (childList != null && childList.Count > 0)
                    {
                        if (!string.IsNullOrEmpty(removeID) && childList.ContainsKey(removeID))
                        {
                            childList.Remove(removeID);
                        }
                        foreach (KeyValuePair<string, string> 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,null, true);
        }
        /// <summary>
        /// 绑定连动级的下拉菜单
        /// </summary>
        /// <param name="ddlGoodsType">传进一个被绑定的DropDownList</param>
        /// <param name="removeID">被排除的ID</param>
        public void BindToDropDownList(DropDownList ddlGoodsType, string removeID)
        {
            BindToDropDownList(ddlGoodsType, removeID,null, true);
        }
        /// <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<string, string> GetChildCategory(string parentID)
        {
            string where = "ParentID='" + parentID + "'";
            if (string.IsNullOrEmpty(parentID))
            {
                where = "ParentID is null or ParentID='" + Guid.Empty + "'";
            }
            List<GoodsCategoryBean> _GoodsCategoryList = SelectList(0, where, string.Empty, false);
            if (_GoodsCategoryList != null && _GoodsCategoryList.Count > 0)
            {
                Dictionary<string, string> categoryList = new Dictionary<string, string>();
                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);

希望对大伙有点帮助....

时间: 2024-08-01 14:27:57

带线的无限级下拉树列表的相关文章

带线的无限级下拉树列表-完整示例篇

前言: 今天在群里有人问起了我一个比较远古的问题:带线的无限级下拉树列表他运行不起来. 最关键的又扯上了CYQ.Data 框架,让我一时觉得比较悬,因为文章是08年时写的,而框架最今年才发力完善的, 所以两者应该是没啥联系的,不过这一问也好,给了我一个写此文章的机会. ps:他把示例的其它代码当成是 CYQ.Data 框架 里的代码.     本文将对之前的代码进行小小的简化,并为之建立一个完整的应用示例,以下为正式应用步骤:   一:新建项目 1:将IDropDownTree及DropDown

jQuery Easyui 下拉树组件combotree_jquery

jQuery EasyUI 组合树(ComboTree) 和组合框的用法差不多,只是在显示上有点差别:一个显示成树状结构,一个显示成列表结构. 项目中做角色授权时,需要做一个下拉框带树结构的 并且可以多选的组件,就想到了easyui的combotree,有关这个组件的用法废话不多说,直接上代码 $('#bianhao').combotree({ url : urlg2 + '/tbdefaultroll/selectByLevel?belongLevel=' + $('#jibie').comb

asp.net使用DataGridTree实现下拉树的方法_实用技巧

本文实例讲述了asp.net使用DataGridTree实现下拉树的方法.分享给大家供大家参考.具体实现方法如下: 下拉树实现原理:输出json到客户端,客户端实现动态加载,中间不会和服务端交互.数据量支持上经测试几千还是很快的.本下拉树控件是用c#+js树实现. 2.c# 计算器 计算字符串数学表达式源码 计算数学表达式原理 采用c#实现 很实用 //a.建立两个栈:第一个位操作数栈,第二个操作符符栈!(将栈定义为string类型) //b.对数字来说是无条件压入数字栈中. //c.而对符号来

asp.net DataGridTree 下拉树 实现方法

asp教程.net datagridtree 下拉树 实现方法 下拉树实现原理 输出json到客户端 客户端实现动态加载 中间不会和服务端交互 数据量支持上 经测试 几千 还是很快的 本下拉树控件是用c#+js树实现 --------------------------------------------------------------------------------   2.c# 计算器 计算字符串数学表达式源码   计算数学表达式原理 采用c#实现 很实用 //a.建立两个栈:第一个

在javascript中以数组链表法实现下拉树

在网页开发中,大部分的下拉菜单都是一行一项并且上下对齐,这样虽然很好但是缺乏层次结构感,客户不知道各个选项之间的关系,因此有的时候我们需要在下拉菜单中以树形结构展示下拉项,给客户更好的体验.比如:假设数据库中有张表存放了中国省市信息,如下所示: 这张表是符合树形结构特征的,它的树形结构如右图所示,相信很多表都有这样的特征,这种结构的表以下拉树展示最好不过了,用户可以直接看出选项之间的关系. javascript实现树形结构应该有很多种方法,我也不知道那些方法都是如何实现的,也不想从网上下载现成的

WPS演示制作下拉式列表导航模板

设计理念:演示文稿内容较多的时候,下拉式列表导航模板,让演讲者在放映过程中轻松定位. 制作过程: 1.启运WPS演示--新建一张空白幻灯片 2.添加几张新幻灯片,在这里我用了5张幻灯片 3.分别给几张幻灯片添加如下内容 第2张幻灯片:第一章第一节 第3张幻灯片:第一章第二节 第4张幻灯片:第二章第一节 第5张幻灯片:第二章第二节 4.视图--母版--幻灯片母版(母版样式可全选删除) 5.格式--背景--填充效果 6.选择"图片"标签--选择图片--找到你需要的图片后,回到填充效果对话框

表连接-MVC4下拉框列表做修改

问题描述 MVC4下拉框列表做修改 我是两个表连接的,下拉框要显示的是另外一个表的Name属性,绑定下拉框列表时可以获取到值,但是点击保存是报错:UPDATE 语句与 FOREIGN KEY 约束"FK_Products_PType"冲突.该冲突发生于数据库"ProductsDB",表"dbo.PType", column 'PTId',语句已终止.求大神指教!!

Java界面的JComboBox下拉菜单列表按钮点击,列表无法弹出是怎么回事???

问题描述 Java界面的JComboBox下拉菜单列表按钮点击,列表无法弹出是怎么回事??? 解决方案 你没给按钮写个监听器吗? 解决方案二: 有可能是脚本有错误,开启脚本错误检测,看下是哪里错了 解决方案三: http://zhidao.baidu.com/link?url=enQJkPyZ2lbZHRczPjs607asvJrk4GIIlmW1xFJB055rlXTp1IcqjaNMqib-W-588J5M7DWBunQP6fJ-YiRRzK监听器代码

jQuery实现的无限级下拉菜单功能示例_jquery

本文实例讲述了jQuery实现的无限级下拉菜单功能.分享给大家供大家参考,具体如下: <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>下拉菜单(无限级)</title> <style> *{ padding: 0; margin: 0; } li{ list-style-type: none;