带线的无限级下拉树列表

 

转自 http://www.cnblogs.com/cyq1162/archive/2008/04/17/1157507.html

 

IDropDownTree.cs

 

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

namespace LTP.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 SoHere.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);
}
}
}

 

 

调用方法很简单:
1.继承自IDropDownTree接口
2.实现3个接口方法

实现接口代码示例[Dispose方法自己实现],最主要的是自己实现获得子级的方法

 

 

public void Dispose()
{

}
public Dictionary<string, string> GetChildCategory(string parentID)
{
string where = "ParentID=" + parentID + "";
if (string.IsNullOrEmpty(parentID))
{
where = "ParentID = 0";
}
List
<SoHere.Model.NewsCategorys> _NewsCategorysList = this.GetModelList(where);
if (_NewsCategorysList != null && _NewsCategorysList.Count > 0)
{
Dictionary
<string, string> categoryList = new Dictionary<string, string>();
for (int i = 0; i < _NewsCategorysList.Count; i++)
{
categoryList.Add(_NewsCategorysList[i].ID.ToString(), _NewsCategorysList[i].Name);
}
return categoryList;
}
return null;
}

public LTP.Common.DropDownTree DropDownTree
{
get { return new LTP.Common.DropDownTree(this); }
}

页面调用代码: 类名.DropDownTree.BindToDropDownList(下拉控件ID);

posted @ 2010-11-14 13:08  BinSys  阅读(211)  评论(0编辑  收藏  举报