筆者前言:本文要說的內容僅針對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