TreeNodeCollection的作用就是装载TreeNode节点。
TreeNodeCollection本身不具备递归的特征。TreeNode的ChildNodes属性具备递归的特征。
递归分析:
关键语句:
AddStandardBudgetAccountsTreeNode(pSBAMDLList, pBudgetCycleID, pBudgetTypeID, sbaNode.ChildNodes, SBAMDL.ID);
每次去当前节点ID作为循环递归的Pid。也就是寻找自己的子科目。
数据源是pSBAMDLList,每次递归都要循环pSBAMDLList.Count次。
递归的出口是:遍历的结束即为递归的出口,则循环pSBAMDLList.Count次,递归返回。
最终构造一个TreeNodeCollection的对象。此对象添加到TreeNode..ChildNodes.Add(*)中。
/// <summary> /// 添加标准预算科目树节点 /// </summary> /// <param name="pSBAMDL">标准预算科目信息</param> /// <param name="pNode">预算类型节点</param> public void AddStandardBudgetAccountsTreeNode(IList<StandardBudgetAccountsMDL> pSBAMDLList, string pBudgetCycleID, string pBudgetTypeID, TreeNodeCollection nodes, string pid) { foreach (StandardBudgetAccountsMDL SBAMDL in pSBAMDLList) { if (SBAMDL.ParentAccountID == pid) { TreeNode sbaNode = new TreeNode(); sbaNode.ToolTip = SBAMDL.AccountCode; sbaNode.Value = SBAMDL.ID; sbaNode.Text = SBAMDL.AccountName; sbaNode.Target = "Chmain"; sbaNode.ImageUrl = Globals.GetOrgImgUrl_t(OT.Organization.EnumOrgTreeNode.Function); sbaNode.NavigateUrl = "StandardBudgetAccountsList.aspx?BudgetType=" + pBudgetTypeID + "&BudgetCycleID=" + pBudgetCycleID + "&PID=" + sbaNode.Value; AddStandardBudgetAccountsTreeNode(pSBAMDLList, pBudgetCycleID, pBudgetTypeID, sbaNode.ChildNodes, SBAMDL.ID); nodes.Add(sbaNode); //这行代码移动到AddStandardBudgetAccountsTreeNode前面,效果是一样的,并且更好理解,放在最后的话,需要理解递归的真正内涵,即找到出口点 } }
其他的一个好例子:http://www.cnblogs.com/duhongyu216/articles/1702591.html