小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

無限級樹的填充方法

 狂人隱士 2012-09-16

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

1.問題描述

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

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

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

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

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

2.樹控件填充代碼

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

/// <summary>

/// 填充樹控件

/// </summary>

/// <param name="dt">樹控件結(jié)構(gòu)所在表</param>

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

/// <param name="strParentID">根節(jié)點值,如果ParentIDnull表示根結(jié)點,傳遞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);

     }

}

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

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

3.調(diào)用示例

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

調(diào)用代碼如下:

// 填充數(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)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多