首页  ·  知识 ·  云计算
带线的无限级下拉树列表
newOperate  http://www.cnblogs.com/hermes262/  综合  编辑:dezai  图片来源:网络
using System;using System.Collections.Generic;using System.Text;using System.Web.UI.WebControls; namespace Interface.Common

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

namespace Interface.Common
{
    public interface IDropDownTree : IDisposable
    {
        /**////
        /// 返回Dictionary里分别对应ID,文本,如果没有子节点返回null
        ///
        /// 父节点ID
        ///
        Dictionary GetChildCategory(string parentID);
        /**////
        /// 代码里写return new Interface.Common.DropDownTree(this);
        ///
        DropDownTree DropDownTree
        {
            get;
        }
    }
    public sealed class DropDownTree
    {
        IDropDownTree _DropDownTree;
        public DropDownTree(IDropDownTree dropDownTree)
        {
            _DropDownTree = dropDownTree;
        }
        /**////
        /// 用于树的前缀
        ///
        /// 是否是同级节点中的最后一个
        /// 本节点是否拥有子节点
        /// 父节点前缀符号
        /// 本节点的前缀
        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 绑定下拉菜单

        /**////
        /// 绑定连动级的下拉菜单
        ///
        /// 传进一个被绑定的DropDownList
        /// 被排除绑定的节点ID
        /// 是否自动释放
        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 parentKeyList = new Queue();//存 有子节点的 节点ID
                Queue parentSignList = new Queue();//对应节点ID的前缀符号
                int itemIndexOf = 0;//父节点所在的位置 
                while (HasChild)
                {
                    int lastOneCount = 1;//用于计算在同级别中是否最后一个
                    Dictionary childList = _DropDownTree.GetChildCategory(currentID);// 得到子节点列表
                    if (childList != null && childList.Count > 0)
                    {
                        if (!string.IsNullOrEmpty(removeID) && childList.ContainsKey(removeID))
                        {
                            childList.Remove(removeID);
                        }
                        foreach (KeyValuePair 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();
                }

            }
        }
        /**////
        /// 绑定连动级的下拉菜单
        ///
        /// 传进一个被绑定的DropDownList
        public void BindToDropDownList(DropDownList ddlGoodsType)
        {
            BindToDropDownList(ddlGoodsType, string.Empty,null, true);
        }
        /**////
        /// 绑定连动级的下拉菜单
        ///
        /// 传进一个被绑定的DropDownList
        /// 被排除的ID
        public void BindToDropDownList(DropDownList ddlGoodsType, string removeID)
        {
            BindToDropDownList(ddlGoodsType, removeID,null, true);
        }
        /**////
        /// 绑定连动级的下拉菜单
        ///
        /// 传进一个被绑定的DropDownList
        /// 被排除的ID,若没有,传null
        /// 起始父ID
        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 GetChildCategory(string parentID)
        {
            string where = "ParentID='" + parentID + "'";
            if (string.IsNullOrEmpty(parentID))
            {
                where = "ParentID is null or ParentID='" + Guid.Empty + "'";
            }
            List _GoodsCategoryList = SelectList(0, where, string.Empty, false);
            if (_GoodsCategoryList != null && _GoodsCategoryList.Count > 0)
            {
                Dictionary categoryList = new Dictionary();
                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);

本文作者:newOperate 来源:http://www.cnblogs.com/hermes262/
CIO之家 www.ciozj.com 微信公众号:imciow
   
免责声明:本站转载此文章旨在分享信息,不代表对其内容的完全认同。文章来源已尽可能注明,若涉及版权问题,请及时与我们联系,我们将积极配合处理。同时,我们无法对文章内容的真实性、准确性及完整性进行完全保证,对于因文章内容而产生的任何后果,本账号不承担法律责任。转载仅出于传播目的,读者应自行对内容进行核实与判断。请谨慎参考文章信息,一切责任由读者自行承担。
延伸阅读