<script language='javascript' src='http://www.shiqiaotou.com/donetk/Header.js'></script> TreeView 生成最常见的一种编程实现方式就是通过“父子关系递归”生成树,一般是自顶向下递归生成。这种方法的缺陷:“由父节点及子节点”的遍历顺序意味着每个子节点的父节点必须存在,否则将搜索不到,即出现“
断层现象”。
本文在递归原理的基础上,通过调节父节点的层次,解决树结构的断层问题。
一、递归生成树的算法:
本文在递归原理的基础上,通过调节父节点的层次,解决树结构的断层问题。
一、递归生成树的算法:
#region
加载部门树*****************************************************
DataSet Dept_ds;
/// <summary>
/// 加载部门树
/// </summary>
public void DeptTree(TreeView tvMenu)
{
Dept_ds = myData.GetDept(); // 执行 "select * from Sys_Department"
DeptTree(tvMenu, 0 , (TreeNode) null );
}
/// <summary>
/// 加载部门树
/// </summary>
private void DeptTree(TreeView tvMenu, int ParentID, TreeNode pNode)
{
string nodeId = " DeptID " ;
string nodeName = " DeptName " ;
string nodeParent = " DeptParent " ;
DataView dvTree = new DataView(Dept_ds.Tables[ 0 ]);
// 过滤nodeParent,得到当前的所有子节点
dvTree.RowFilter = nodeParent + " = " + ParentID;
foreach (DataRowView drv in dvTree)
{
TreeNode newNode = new TreeNode();
newNode.Text = drv[nodeName].ToString().Trim();
newNode.ToolTip = drv[nodeName].ToString().Trim() + " [ID= " + drv[nodeId].ToString().Trim() + " ] " ;
newNode.Value = drv[nodeId].ToString().Trim();
newNode.Target = " user " ;
newNode.ImageUrl = ImagePath + " menu/dept.gif " ;
newNode.NavigateUrl = " UserChoose_User.aspx?DeptID= " + drv[nodeId].ToString().Trim();
if (pNode == null )
{ // 添加根节点
newNode.SelectAction = TreeNodeSelectAction.SelectExpand;
newNode.Expanded = false ;
newNode.PopulateOnDemand = false ;
tvMenu.Nodes.Add(newNode); // ***注意区别:根节点
DeptTree( null , Int32.Parse(drv[nodeId].ToString().Trim()), newNode); // 递归
}
else
{ // ?添加子节点
newNode.SelectAction = TreeNodeSelectAction.SelectExpand;
newNode.Expanded = false ;
newNode.PopulateOnDemand = false ;
pNode.ChildNodes.Add(newNode); // ***注意区别:子节点
DeptTree( null , Int32.Parse(drv[nodeId].ToString().Trim()), newNode); // 递归
}
}
}
#endregion
文章来源于 http://www.cnblogs.com/wf225 版权归原作者所有<script language='javascript' src='http://www.shiqiaotou.com/donetk/Footer.js'></script>
DataSet Dept_ds;
/// <summary>
/// 加载部门树
/// </summary>
public void DeptTree(TreeView tvMenu)
{
Dept_ds = myData.GetDept(); // 执行 "select * from Sys_Department"
DeptTree(tvMenu, 0 , (TreeNode) null );
}
/// <summary>
/// 加载部门树
/// </summary>
private void DeptTree(TreeView tvMenu, int ParentID, TreeNode pNode)
{
string nodeId = " DeptID " ;
string nodeName = " DeptName " ;
string nodeParent = " DeptParent " ;
DataView dvTree = new DataView(Dept_ds.Tables[ 0 ]);
// 过滤nodeParent,得到当前的所有子节点
dvTree.RowFilter = nodeParent + " = " + ParentID;
foreach (DataRowView drv in dvTree)
{
TreeNode newNode = new TreeNode();
newNode.Text = drv[nodeName].ToString().Trim();
newNode.ToolTip = drv[nodeName].ToString().Trim() + " [ID= " + drv[nodeId].ToString().Trim() + " ] " ;
newNode.Value = drv[nodeId].ToString().Trim();
newNode.Target = " user " ;
newNode.ImageUrl = ImagePath + " menu/dept.gif " ;
newNode.NavigateUrl = " UserChoose_User.aspx?DeptID= " + drv[nodeId].ToString().Trim();
if (pNode == null )
{ // 添加根节点
newNode.SelectAction = TreeNodeSelectAction.SelectExpand;
newNode.Expanded = false ;
newNode.PopulateOnDemand = false ;
tvMenu.Nodes.Add(newNode); // ***注意区别:根节点
DeptTree( null , Int32.Parse(drv[nodeId].ToString().Trim()), newNode); // 递归
}
else
{ // ?添加子节点
newNode.SelectAction = TreeNodeSelectAction.SelectExpand;
newNode.Expanded = false ;
newNode.PopulateOnDemand = false ;
pNode.ChildNodes.Add(newNode); // ***注意区别:子节点
DeptTree( null , Int32.Parse(drv[nodeId].ToString().Trim()), newNode); // 递归
}
}
}
#endregion
文章来源于 http://www.cnblogs.com/wf225 版权归原作者所有<script language='javascript' src='http://www.shiqiaotou.com/donetk/Footer.js'></script>