摘要:本文介紹將存儲在數(shù)據(jù)庫中的樹型數(shù)據(jù)結構通過DataSet填充到TreeView的方法,并給出填充的函數(shù)實現(xiàn)。
1.問題描述
TreeView是ASP.NET中常用的控件之一,常用的如部門、人員的顯示。圖1為一個部門、人員顯示的界面,圖中我將部門中的敏感數(shù)據(jù)抹掉了。

該應用采用了框架方式,左邊框架包含的aspx頁顯示部門,點擊某個部門后,該部門的所有人員顯示到右面的頁面中。
本例采用的部門樹結構為Departments(DepartID, DepartName, SerialNum, ParentID)。其中DepartID為部門ID,自動增長;DepartName為部門名;ParentID為父結點ID;SerialNum為內部序號,即ParentID相同的部門的內部排序序號。
根結點可以用ParentID為null或-1表示,如果建立外鍵約束(ParentID參照DepartID取值),則ParentID只能取空值或DepartID中存在的值,這樣我們用null表示根結點。
樹控件填充后,還需要在點擊某個結點時將該結點的DepartID的值傳遞到右面界面,以便顯示該部門用戶。
2.樹控件填充代碼
下面的函數(shù)采用遞歸方式填充樹控件,參數(shù)的意義參考注釋的內容。如果只需要填充,不需要導航,則可以取得tn.NavigateUrl和tn.Target賦值那兩句,并去掉該函數(shù)最后兩個參數(shù)。如果還有其它需要,請自行修改。
/// <summary>
/// 填充樹控件
/// </summary>
/// <param name="dt">樹控件結構所在表</param>
/// <param name="tns">節(jié)點集合,調用時可以將TreeView1.Nodes傳遞進來</param>
/// <param name="strParentID">根節(jié)點值,如果ParentID用null表示根結點,傳遞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,這樣點擊一個結點后,會選中該結點,并自動展開。
同時設置了NavigateUrl和Target屬性,點擊結點后會自動在Target框架中顯示NavigateUrl頁面。且該頁面后有參數(shù)?P=x,這樣可以在右邊頁面中用Request[“P”]取得傳遞進來的DepartID。
3.調用示例
假設TreeView控件ID為tvDeparts。數(shù)據(jù)集為類型化數(shù)據(jù)集DepartSet,部門信息存放在Departments表中。顯示用戶的頁面為Users.aspx,框架ID為Content。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");
|