天天看點

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中實作就友善多了。

繼續閱讀