日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

無限級樹的填充方法

 狂人隱士 2012-09-16

摘要:本文介紹將存儲在數(shù)據(jù)庫中的樹型數(shù)據(jù)結構通過DataSet填充到TreeView的方法,并給出填充的函數(shù)實現(xiàn)。

1.問題描述

TreeViewASP.NET中常用的控件之一,常用的如部門、人員的顯示。圖1為一個部門、人員顯示的界面,圖中我將部門中的敏感數(shù)據(jù)抹掉了。

該應用采用了框架方式,左邊框架包含的aspx頁顯示部門,點擊某個部門后,該部門的所有人員顯示到右面的頁面中。

本例采用的部門樹結構為Departments(DepartID, DepartName, SerialNum, ParentID)。其中DepartID為部門ID,自動增長;DepartName為部門名;ParentID為父結點ID;SerialNum為內部序號,即ParentID相同的部門的內部排序序號。

根結點可以用ParentIDnull-1表示,如果建立外鍵約束(ParentID參照DepartID取值),則ParentID只能取空值或DepartID中存在的值,這樣我們用null表示根結點。

樹控件填充后,還需要在點擊某個結點時將該結點的DepartID的值傳遞到右面界面,以便顯示該部門用戶。

2.樹控件填充代碼

下面的函數(shù)采用遞歸方式填充樹控件,參數(shù)的意義參考注釋的內容。如果只需要填充,不需要導航,則可以取得tn.NavigateUrltn.Target賦值那兩句,并去掉該函數(shù)最后兩個參數(shù)。如果還有其它需要,請自行修改。

/// <summary>

/// 填充樹控件

/// </summary>

/// <param name="dt">樹控件結構所在表</param>

/// <param name="tns">節(jié)點集合,調用時可以將TreeView1.Nodes傳遞進來</param>

/// <param name="strParentID">根節(jié)點值,如果ParentIDnull表示根結點,傳遞null</param>

/// <param name="strParentField">父節(jié)點字段名,本例中為ParentID</param>

/// <param name="strSortField">排序字段名,本例中為SerialNum</param>

/// <param name="strTextField">顯示的字段名,本例中為DepartName</param>

/// <param name="strValueField">值字段名,也是傳遞到右邊頁面的值,為DepartID</param>

/// <param name="strNavigate">右邊框架中顯示的頁Url</param>

/// <param name="strTarget">右邊框架的id</param>

public void FillTree(DataTable dt, TreeNodeCollection tns, string strParentID, string strParentField, string strSortField, string strTextField, string strValueField, string strNavigate, string strTarget)

{

      TreeNode tn = null;

      DataRow[] drs;

     if (strParentID == null)

         drs = dt.Select(string.Format("{0} is null", strParentField), strSortField);

     else

         drs = dt.Select(string.Format("{0}={1}", strParentField, strParentID), strSortField);

 

     foreach (DataRow dr in drs)

     {

         tn = new TreeNode();

         tn.Text = dr[strTextField].ToString();

         tn.Value = dr[strValueField].ToString();

         tn.NavigateUrl = string.Format("{0}?P={1}", strNavigate, dr[strValueField]);

         tn.Target = strTarget;

         tn.SelectAction = TreeNodeSelectAction.SelectExpand;

         tns.Add(tn);

 

         FillTree(dt, tn.ChildNodes, dr[strValueField].ToString(), strParentField, strSortField, strTextField, strValueField, strNavigate, strTarget);

     }

}

該段代碼中,將新建的結點的SelectAction屬性設置為SelectExpand,這樣點擊一個結點后,會選中該結點,并自動展開。

同時設置了NavigateUrlTarget屬性,點擊結點后會自動在Target框架中顯示NavigateUrl頁面。且該頁面后有參數(shù)?P=x,這樣可以在右邊頁面中用Request[“P”]取得傳遞進來的DepartID。

3.調用示例

假設TreeView控件IDtvDeparts。數(shù)據(jù)集為類型化數(shù)據(jù)集DepartSet,部門信息存放在Departments表中。顯示用戶的頁面為Users.aspx,框架IDContent。ParentID字段用null表示根結點。

調用代碼如下:

// 填充數(shù)據(jù)集

DepartSet ds = new DepartSet();

DepartSetTableAdapters.DepartmentsTableAdapter adp = new DepartSetTableAdapters.DepartmentsTableAdapter();

adp.Fill(ds.Departments);

 

// 填充樹

tvDeparts.Nodes.Clear();

FillTree(ds.Departments, tvDeparts.Nodes, null, "ParentID", "SerialNum", "DepartName", "DepartID", "Users.aspx", "Content");

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多