天天看点

带线的无限级下拉树列表

好多年没写文章了

这里就分享点自己原创的一点破代码,效果如图下:

带线的无限级下拉树列表

本人的提供的代码如下:

带线的无限级下拉树列表

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);

带线的无限级下拉树列表
带线的无限级下拉树列表

        /// 代码里写return new interface.common.dropdowntree(this);

带线的无限级下拉树列表
带线的无限级下拉树列表

        dropdowntree dropdowntree

带线的无限级下拉树列表

        {

带线的无限级下拉树列表

            get;

带线的无限级下拉树列表

        }

带线的无限级下拉树列表

    }

带线的无限级下拉树列表

    public sealed class dropdowntree

带线的无限级下拉树列表
带线的无限级下拉树列表

        idropdowntree _dropdowntree;

带线的无限级下拉树列表

        public dropdowntree(idropdowntree dropdowntree)

带线的无限级下拉树列表
带线的无限级下拉树列表

            _dropdowntree = dropdowntree;

带线的无限级下拉树列表
带线的无限级下拉树列表
带线的无限级下拉树列表

        /// 用于树的前缀

带线的无限级下拉树列表
带线的无限级下拉树列表

        /// <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 += "┬";

带线的无限级下拉树列表
带线的无限级下拉树列表
带线的无限级下拉树列表
带线的无限级下拉树列表

                result += "─";

带线的无限级下拉树列表
带线的无限级下拉树列表

            return result;

带线的无限级下拉树列表
带线的无限级下拉树列表

        #region 绑定下拉菜单

带线的无限级下拉树列表
带线的无限级下拉树列表
带线的无限级下拉树列表

        /// 绑定连动级的下拉菜单

带线的无限级下拉树列表
带线的无限级下拉树列表

        /// <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);

带线的无限级下拉树列表
带线的无限级下拉树列表
带线的无限级下拉树列表

                            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();

带线的无限级下拉树列表
带线的无限级下拉树列表
带线的无限级下拉树列表
带线的无限级下拉树列表
带线的无限级下拉树列表
带线的无限级下拉树列表
带线的无限级下拉树列表
带线的无限级下拉树列表
带线的无限级下拉树列表

        public void bindtodropdownlist(dropdownlist ddlgoodstype)

带线的无限级下拉树列表
带线的无限级下拉树列表

            bindtodropdownlist(ddlgoodstype, string.empty,null, true);

带线的无限级下拉树列表
带线的无限级下拉树列表
带线的无限级下拉树列表
带线的无限级下拉树列表
带线的无限级下拉树列表
带线的无限级下拉树列表

        /// <param name="removeid">被排除的id</param>

带线的无限级下拉树列表

        public void bindtodropdownlist(dropdownlist ddlgoodstype, string removeid)

带线的无限级下拉树列表
带线的无限级下拉树列表

            bindtodropdownlist(ddlgoodstype, removeid,null, true);

带线的无限级下拉树列表
带线的无限级下拉树列表
带线的无限级下拉树列表
带线的无限级下拉树列表
带线的无限级下拉树列表
带线的无限级下拉树列表

        /// <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); }

带线的无限级下拉树列表
带线的无限级下拉树列表
带线的无限级下拉树列表

页面调用代码: 类名.dropdowntree.bindtodropdownlist(下拉控件id);

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