天天看點

帶線的無限級下拉樹清單

好多年沒寫文章了

這裡就分享點自己原創的一點破代碼,效果如圖下:

帶線的無限級下拉樹清單

本人的提供的代碼如下:

帶線的無限級下拉樹清單

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方法自己實作],最主要的是自己實作獲得子級的方法

帶線的無限級下拉樹清單
帶線的無限級下拉樹清單

 idropdowntree 成員#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);

希望對大夥有點幫助....