无限级树的填充方法

无限级树的填充方法

 

摘要:本文介绍将存储在数据库中的树型数据结构通过DataSet填充到TreeView的方法,并给出填充的函数实现。

1.问题描述

TreeViewASP.NET中常用的控件之一,常用的如部门、人员的显示。图1为一个部门、人员显示的界面,图中我将部门中的敏感数据抹掉了。

该应用采用了框架方式,左边框架包含的aspx页显示部门,点击某个部门后,该部门的所有人员显示到右面的页面中。

本例采用的部门树结构为Departments(DepartID, DepartName, SerialNum, ParentID)。其中DepartID为部门ID,自动增长;DepartName为部门名;ParentID为父结点IDSerialNum为内部序号,即ParentID相同的部门的内部排序序号。

根结点可以用ParentIDnull-1表示,如果建立外键约束(ParentID参照DepartID取值),则ParentID只能取空值或DepartID中存在的值,这样我们用null表示根结点。

树控件填充后,还需要在点击某个结点时将该结点的DepartID的值传递到右面界面,以便显示该部门用户。

2.树控件填充代码

下面的函数采用递归方式填充树控件,参数的意义参考注释的内容。如果只需要填充,不需要导航,则可以取得tn.NavigateUrltn.Target赋值那两句,并去掉该函数最后两个参数。如果还有其它需要,请自行修改。

/// <summary>

/// 填充树控件

/// </summary>

/// <param name="dt">树控件结构所在表</param>

/// <param name="tns">节点集合,调用时可以将TreeView1.Nodes传递进来</param>

/// <param name="strParentID">根节点值,如果ParentIDnull表示根结点,传递null</param>

/// <param name="strParentField">父节点字段名,本例中为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页面。且该页面后有参数?P=x,这样可以在右边页面中用Request[“P”]取得传递进来的DepartID

3.调用示例

假设TreeView控件IDtvDeparts。数据集为类型化数据集DepartSet,部门信息存放在Departments表中。显示用户的页面为Users.aspx,框架IDContentParentID字段用null表示根结点。

调用代码如下:

// 填充数据集

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");

 

 

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值