如下图所示:
该控件为无限级扩展的,只需要指定其子节点字段名(默认为ID),父节点字段名(默认为parentID),以及第一层父节点的值即可(默认为0)。
1.首先定义常量
protected
const
string
strT
=
"
├
;
strL
└
strI
│
DataTable tempTable;
int
lay
//
节点层数
level
DropDownList顺序
2.添加属性
[Category(
数据
),Description(
第一层父节点的值
)]
public
FirstParentValue
{
get
object
obj
ViewState[
FirstParentValue
];
return
((obj
==
null
)
?
:(
)obj);
}
set
ViewState[
]
value;
}
[Category(
子字段名
ChildField
ChildField
ID
父字段名
ParentField
ParentField
parentID
显示文本字段名
ShowText
ShowText
name
3.计算当前节点所在的层以及是否为子节点,是否有兄弟节点等函数,用于生成树形
///
<summary>
递归算出指定ID所在树中的层数
</summary>
<param name="treeTable"></param>
<param name="ID">
节点ID
</param>
private
void
FindLay(DataTable treeTable,
ID)
for
(
i
;i
<
treeTable.Rows.Count;i
++
)
if
(ID
.Parse(treeTable.Rows[i][
this
.ChildField].ToString()))
parentID
.ParentField].ToString());
如果父节点不是根节点,递归
(parentID
!=
lay
FindLay(treeTable,
.ParentField].ToString()));
}
}
判断是否有子接点
<param name="dt"></param>
当前节点的ID
<returns></returns>
bool
IsExistChildNodes(DataTable dt,
ID)
flag
false
(ID
flag;
dt.Rows.Count;i
(dt.Rows[i][
.ParentField].ToString()
ID)
flag
true
else
判断是否有兄弟节点
IsBorthorNodes(DataTable dt,
{
.ChildField].ToString()
&&
i
dt.Rows.Count
-
1
dt.Rows[i
+
][
.ParentField].ToString())
flag
判断当前节点是否为子节点
<param name="ID"></param>
IsChildNode(DataTable dt,
{
{
4.递归生成树形
数据添加并生成树形
BindData(DataTable dt,
DataRow[] dr;
dr
dt.Select(
.ParentField
ID,
.ChildField
ASC
);
x
;x
dr.Length;x
{
str
""
;
lay
.FindLay(dt,
.Parse(dr[x][
.ChildField].ToString()));
.IsChildNode(dt,dr[x][this.ChildField
].ToString())
{
lay;i
str
+=
strI;
.IsBorthorNodes(dt,dr[x][
id
.Items.Insert(level,
new
ListItem(str
strT
dr[x][this.ShowText
].ToString(),dr[x][this.ChildField
].ToString()));
strL
level
.BindData(dt,dr[x][
.ChildField].ToString());
递归生成树
5.绑定数据
绑定数据
<param name="dt">
数据源DataTable
BindListData(DataTable dt)
tempTable
dt.Clone();
.BindData(dt,
.FirstParentValue.ToString());
使用的时候调用该函数进行数据绑定!
在ASP.NET中实现这个真费劲,在Silverlight中实现就方便多了。