如下圖所示:
該控件為無限級擴充的,隻需要指定其子節點字段名(預設為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中實作就友善多了。