筆者前言:本文要說的内容僅針對ASP.NET 2.0以上版本适用,内容也非常的簡單,本來不應該放在首頁的,但發現不知道的開發者非常多,有必要提醒一下。是以請熟悉Treeview的朋友包涵了,呵呵。
現在Ajax流行,各類Tree的第三方控件支援異步加載的非常多。
我們項目組的成員通常到處找些樹控件來用,給項目的穩定性帶來很多隐患,出了幾次問題。
我建議大家考慮直接使用.net自帶的TreeView控件。但這個控件這樣才能異步加載呢?
先看看示例代碼:
其中
SelectAction
="Expand"
PopulateOnDemand
="true" 這兩個屬性是關鍵,在背景代碼中,大家也可以看到給有子節點的節點,需要設定相關屬性

<
asp:TreeView
ID
="TreeView1"
runat
="server"
EnableClientScript
="true"
OnTreeNodePopulate
="PopulateNode"
ImageSet
="Arrows"
ExpandDepth
="0"
>

<
Nodes
>

<
asp:TreeNode
Text
="部門樹"
Value
="部門樹"
SelectAction
="Expand"
PopulateOnDemand
="true"
/>

</
Nodes
>

</
asp:TreeView
>
背景代碼:
注意PopulateNode ,這個代碼中的寫法,是因為我連接配接的是一個每個層級的部門分别放在不同資料庫表,如果各個層級的部門資料都在同一個表裡,代碼将更加簡單。
TopSmart.UtilClass.Data.IDatabase 這個我自己封裝資料庫的類,大家可以替換使用自己常用的資料庫類,然後就可以了

public
void
PopulateNode(Object sender, TreeNodeEventArgs e)
{
PopulateMe(e.Node,e.Node.Depth);
}



public
void
PopulateMe(TreeNode node,
int
Depth)
{
TopSmart.UtilClass.Data.IDatabase db = TopSmart.UtilClass.Data.DataAccess.DatabaseCreate("hr");
DataTable dt;
if (Depth == 0)
dt = db.GetDataTableFromSQL("select t.onelevelname as name,t.onelevelno as no from hrt_onelevel_dic t where t.valid = 1");
else if (Depth == 1)
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 + "'");
else
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 + "'");
if (dt.Rows.Count > 0)
{
foreach (DataRow row in dt.Rows)
{
TreeNode NewNode = new TreeNode(row["name"].ToString(), row["no"].ToString());
NewNode.PopulateOnDemand = (Depth == 2) ? false : true;
NewNode.SelectAction = TreeNodeSelectAction.Expand;
node.ChildNodes.Add(NewNode);
}
}
}
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