带线的无限级下拉树列表

好多年没写文章了
这里就分享点自己原创的一点破代码,效果如图下:
带线的无限级下拉树列表_第1张图片
本人的提供的代码如下:

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方法自己实现],最主要的是自己实现获得子级的方法
  IDropDownTree 成员 #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);

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

你可能感兴趣的:(带线的无限级下拉树列表)