遞歸的定義:一個過程或函數在其定義或說明中有直接或間接調用自身的一種方法,它通常把一個大型復雜的問題層層轉化為一個與原問題相似的規模較小的問題來求解,遞歸策略只需少量的程序就可描述出解題過程所需要的多次重復計算,大大地減少了程序的代碼量。遞歸的能力在於用有限的語句來定義對象的無限集合。一般來說,遞歸需要有邊界條件、遞歸前進段和遞歸返回段。當邊界條件不滿足時,遞歸前進;當邊界條件滿足時,遞歸返回
遞歸在實際的項目中的應用其實也有很多,比如:無限級聯菜單,菜單控制管理,網站欄目設置等等,這些問題對於一個老鳥來講是一個比較簡單的問題,對於一個新手來講可能要費點神,很容易出現死循環等異常,下面詳細講解一個在項目中經常會碰到的一種遞歸的方法,遞歸樹型控件。
遞歸對象:
//AM_Department public class AM_Department { /// <summary> /// ID /// </summary> public virtual long ID { get; set; } /// <summary> /// 部門名稱 /// </summary> public virtual string DepartmentName { get; set; } /// <summary> /// 父級部門ID /// </summary> public virtual long ParentID { get; set; } /// <summary> /// 排序級別 /// </summary> public virtual int DisplayOrder { get; set; } /// <summary> /// Dec /// </summary> public virtual string Dec { get; set; } }
遞歸方法
// 遍歷父菜單 public static void BindTreeOfHandler(TreeView TreeList) { Organization OranObjBll = new Organization(); IList<AM_Department> deptList = OranObjBll.GetAmDepartmentInfo(); // 查詢Am_Department對象 string rootstr = "菜單管理"; TreeNode rootNode = new TreeNode(rootstr); rootNode.Value = "-1"; rootNode.Target = ""; rootNode.Expanded = true; sBuffer.Clear(); sBuffer.Append("AddOrganization.aspx?organizationid="); sBuffer.Append(0); sBuffer.Append("&&organizationname="); sBuffer.Append(HttpUtility.UrlEncode(rootstr)); rootNode.NavigateUrl = sBuffer.ToString(); PopulateTreeViewOfHandler(deptList, 0, rootNode); // 遍歷子項 TreeList.Nodes.Add(rootNode); }
// 遍歷子菜單 private static void PopulateTreeViewOfHandler(IList<AM_Department> deptList, long parentid, TreeNode parentNode) {
// 緩存Ilist集合 IList<AM_Department> ListAmDepartObj = (from dept in deptList where dept.ParentID == parentid select dept).ToList<AM_Department>(); foreach (var listpartment in ListAmDepartObj) { TreeNode OrganizeMode = new TreeNode(listpartment.DepartmentName); OrganizeMode.Value = listpartment.ID.ToString(); OrganizeMode.Expanded = true; OrganizeMode.Target = ""; sBuffer.Clear(); sBuffer.Append("AddOrganization.aspx?organizationid="); sBuffer.Append(HttpUtility.UrlEncode(listpartment.ID.ToString())); sBuffer.Append("&&organizationparentid="); sBuffer.Append(HttpUtility.UrlEncode(parentid.ToString())); sBuffer.Append("&&organizationname="); sBuffer.Append(HttpUtility.UrlEncode(listpartment.DepartmentName)); OrganizeMode.NavigateUrl = sBuffer.ToString(); parentNode.ChildNodes.Add(OrganizeMode); // 將子樹加到父菜單中 PopulateTreeViewOfHandler(deptList, listpartment.ID, OrganizeMode); // 遞歸 } }
調用:
BindTreeOfHandler(tree_list)
總結:
在應用中可以把遞歸單獨封裝一個操作類,把所需的操作的控件,用對象的方式傳遞,這樣客戶端的代碼就會很少,也符合單一職責原則。