天天看点

Asp.net实现继承于DropDownList的树状控件(转)

  如下图所示:

该控件为无限级扩展的,只需要指定其子节点字段名(默认为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中实现就方便多了。

继续阅读