天天看點

Tree控件的異步加載方案的選擇建議(C#,ASP.NET 2.0)

筆者前言:本文要說的内容僅針對ASP.NET 2.0以上版本适用,内容也非常的簡單,本來不應該放在首頁的,但發現不知道的開發者非常多,有必要提醒一下。是以請熟悉Treeview的朋友包涵了,呵呵。

現在Ajax流行,各類Tree的第三方控件支援異步加載的非常多。

我們項目組的成員通常到處找些樹控件來用,給項目的穩定性帶來很多隐患,出了幾次問題。

我建議大家考慮直接使用.net自帶的TreeView控件。但這個控件這樣才能異步加載呢?

先看看示例代碼:

其中

 SelectAction

="Expand"

 PopulateOnDemand

="true" 這兩個屬性是關鍵,在背景代碼中,大家也可以看到給有子節點的節點,需要設定相關屬性

Tree控件的異步加載方案的選擇建議(C#,ASP.NET 2.0)

<

asp:TreeView 

ID

="TreeView1"

 runat

="server"

 EnableClientScript

="true"

 OnTreeNodePopulate

="PopulateNode"

 ImageSet

="Arrows"

 ExpandDepth

="0"

>

Tree控件的異步加載方案的選擇建議(C#,ASP.NET 2.0)

<

Nodes

>

Tree控件的異步加載方案的選擇建議(C#,ASP.NET 2.0)

<

asp:TreeNode 

Text

="部門樹"

 Value

="部門樹"

 SelectAction

="Expand"

 PopulateOnDemand

="true"

/>

Tree控件的異步加載方案的選擇建議(C#,ASP.NET 2.0)

</

Nodes

>

Tree控件的異步加載方案的選擇建議(C#,ASP.NET 2.0)

</

asp:TreeView

>

背景代碼:

注意PopulateNode ,這個代碼中的寫法,是因為我連接配接的是一個每個層級的部門分别放在不同資料庫表,如果各個層級的部門資料都在同一個表裡,代碼将更加簡單。

TopSmart.UtilClass.Data.IDatabase 這個我自己封裝資料庫的類,大家可以替換使用自己常用的資料庫類,然後就可以了

Tree控件的異步加載方案的選擇建議(C#,ASP.NET 2.0)

public

void

 PopulateNode(Object sender, TreeNodeEventArgs e)

Tree控件的異步加載方案的選擇建議(C#,ASP.NET 2.0)
Tree控件的異步加載方案的選擇建議(C#,ASP.NET 2.0)
Tree控件的異步加載方案的選擇建議(C#,ASP.NET 2.0)

{

Tree控件的異步加載方案的選擇建議(C#,ASP.NET 2.0)

        PopulateMe(e.Node,e.Node.Depth);

Tree控件的異步加載方案的選擇建議(C#,ASP.NET 2.0)

    }

Tree控件的異步加載方案的選擇建議(C#,ASP.NET 2.0)
Tree控件的異步加載方案的選擇建議(C#,ASP.NET 2.0)
Tree控件的異步加載方案的選擇建議(C#,ASP.NET 2.0)

public

void

 PopulateMe(TreeNode node, 

int

 Depth)

Tree控件的異步加載方案的選擇建議(C#,ASP.NET 2.0)
Tree控件的異步加載方案的選擇建議(C#,ASP.NET 2.0)
Tree控件的異步加載方案的選擇建議(C#,ASP.NET 2.0)

{

Tree控件的異步加載方案的選擇建議(C#,ASP.NET 2.0)

        TopSmart.UtilClass.Data.IDatabase db = TopSmart.UtilClass.Data.DataAccess.DatabaseCreate("hr");

Tree控件的異步加載方案的選擇建議(C#,ASP.NET 2.0)
Tree控件的異步加載方案的選擇建議(C#,ASP.NET 2.0)

        DataTable dt;

Tree控件的異步加載方案的選擇建議(C#,ASP.NET 2.0)

        if (Depth == 0)

Tree控件的異步加載方案的選擇建議(C#,ASP.NET 2.0)

            dt = db.GetDataTableFromSQL("select t.onelevelname as name,t.onelevelno as no from hrt_onelevel_dic t where t.valid = 1");

Tree控件的異步加載方案的選擇建議(C#,ASP.NET 2.0)

        else if (Depth == 1)

Tree控件的異步加載方案的選擇建議(C#,ASP.NET 2.0)

            dt = db.GetDataTableFromSQL("select t.twolevelname as name,t.twolevelno as no from hrt_twolevel_dic t where t.valid = 1 and t.onelevelno = '" + node.Value + "'");

Tree控件的異步加載方案的選擇建議(C#,ASP.NET 2.0)

        else

Tree控件的異步加載方案的選擇建議(C#,ASP.NET 2.0)

            dt = db.GetDataTableFromSQL("select t.deptname as name,t.deptno as no from hrt_dept_dic t where t.valid = 1 and t.twolevelno = '" + node.Value + "'");

Tree控件的異步加載方案的選擇建議(C#,ASP.NET 2.0)
Tree控件的異步加載方案的選擇建議(C#,ASP.NET 2.0)

        if (dt.Rows.Count > 0)

Tree控件的異步加載方案的選擇建議(C#,ASP.NET 2.0)
Tree控件的異步加載方案的選擇建議(C#,ASP.NET 2.0)
Tree控件的異步加載方案的選擇建議(C#,ASP.NET 2.0)

{

Tree控件的異步加載方案的選擇建議(C#,ASP.NET 2.0)

            foreach (DataRow row in dt.Rows)

Tree控件的異步加載方案的選擇建議(C#,ASP.NET 2.0)
Tree控件的異步加載方案的選擇建議(C#,ASP.NET 2.0)
Tree控件的異步加載方案的選擇建議(C#,ASP.NET 2.0)

{

Tree控件的異步加載方案的選擇建議(C#,ASP.NET 2.0)

                TreeNode NewNode = new TreeNode(row["name"].ToString(), row["no"].ToString());

Tree控件的異步加載方案的選擇建議(C#,ASP.NET 2.0)

                NewNode.PopulateOnDemand = (Depth == 2) ? false : true;

Tree控件的異步加載方案的選擇建議(C#,ASP.NET 2.0)

                NewNode.SelectAction = TreeNodeSelectAction.Expand;

Tree控件的異步加載方案的選擇建議(C#,ASP.NET 2.0)

                node.ChildNodes.Add(NewNode);

Tree控件的異步加載方案的選擇建議(C#,ASP.NET 2.0)

            }

Tree控件的異步加載方案的選擇建議(C#,ASP.NET 2.0)

        }

Tree控件的異步加載方案的選擇建議(C#,ASP.NET 2.0)

    }

NewNode.PopulateOnDemand 

=

 (Depth 

==

2

?

false

 : 

true

; 這句是因為等于2的時候,我的系統沒有更低的子部門了。大家可以靈活使用,呵呵。

代碼完畢。大家看看,是不是很簡單?

而且簡單的就控制哪個節點可以異步加載,哪個不用。不用寫腳本,不用寫web service,呵呵。

官方的文檔,大家可以參考msdn:位址為

ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.NETDEVFX.v20.chs/cpref16/html/P_System_Web_UI_WebControls_TreeNode_PopulateOnDemand.htm

v