/数据库表结构:code name url parentcode    name       url      parent
0001    系统管理   #         00
000101  用户信息   #         0001
......//构建树形菜单 方法的调用形式是:InitData("00"); 
//其中00在数据库里设定为顶级父类 
/
private string InitData(string parentId)
    {
        StringBuilder sb = new StringBuilder();        DataRow[] parentRows = GetData().Tables[0].Select("parent='" + parentId + "'");        foreach (DataRow parentRow in parentRows)
        {            DataRow[] childRows = GetData().Tables[0].Select("parent='" + parentRow["code"].ToString() + "'");            sb.Append("<li><span>" + parentRow["name"].ToString() + "</span>");
            sb.Append("<ul>");            foreach (DataRow childRow in childRows)
            {
                string code = childRow["code"].ToString();                DataRow[] leafRows = GetData().Tables[0].Select("parent='" + childRow["code"].ToString() + "'");                int count = leafRows.Count();                if (leafRows.Count() > 0)
                {
                    sb.Append("<li><span>" + childRow["name"].ToString() + "</span>");
                    sb.Append("<ul>");
                    foreach (DataRow leafRow in leafRows)
                    {
                        sb.Append("<li>");
                        sb.Append("<a href='"+leafRow["url"].ToString()+"'>" + leafRow["name"].ToString() + "</a>");
                        sb.Append("</li>");
                    }
                    sb.Append("</ul>");
                    sb.Append("</li>");                }
                else
                {
                    sb.Append("<li>");
                    sb.Append("<a href='"+childRow["url"].ToString()+"'>" + childRow["name"].ToString() + "</a>");
                    sb.Append("</li>");
                }
            }            sb.Append("</ul>");
            sb.Append("</li>");        }        return sb.ToString();    }
以上方法能否改为递归?能改的话如何改?请赐教!
该方法是根据GetData()这个方法的DateSet数据结来构建一个以<ul>标签实现的树形菜单。
以上方法写死是三级菜单,如果数据库有四级,还得写代码判断,我想将此方法用递归来实现,但不知道如何重构。

解决方案 »

  1.   

    可以、   /// <summary>
        /// 递归添加节点
        /// </summary>
        /// <param name="id"></param>
        /// <param name="parentnode"></param>
        private void AddNode(int id, TreeNode parentnode)
        {
            string sql = "select * from Subject";//sql 语句
            DataTable table = DAL.DBHelper.GetTable(sql);//获取数据        DataView view = new DataView(table);//把表数据添加到自定义视图中        view.RowFilter = "ParentId=" + id;//设置视图查询条件        foreach (DataRowView row in view)//遍历视图中数据
            {
                TreeNode node = new TreeNode();//实例化树节点
                node.Expanded = false;
                node.Text = row[1].ToString();
                node.Value = row[0].ToString();
                int newid = Convert.ToInt32(row[0]);            if (parentnode != null)
                {
                    //node.Expanded = false;
                    parentnode.ChildNodes.Add(node);
                    AddNode(newid, node);//递归查找节点
                }
                else
                {
                    TreeView1.Nodes.Add(node);
                    AddNode(newid, node);
                }        }
        }
      

  2.   


    InitData方法没有注释,重新注一下!
    /*
     *
     */
    private string InitData(string parentId)
        {
            StringBuilder sb = new StringBuilder();
            
            //第一次筛选数据  parent="00"
            DataRow[] parentRows = GetData().Tables[0].Select("parent='" + parentId + "'");        foreach (DataRow parentRow in parentRows)
            {
                //第二次筛选数据  parent="0001"
                DataRow[] childRows = GetData().Tables[0].Select("parent='" + parentRow["code"].ToString() + "'");            sb.Append("<li><span>" + parentRow["name"].ToString() + "</span>");
                sb.Append("<ul>");            foreach (DataRow childRow in childRows)
                {
                    string code = childRow["code"].ToString();
                    
                    //第三次筛选数据  parent="000101"
                    DataRow[] leafRows = GetData().Tables[0].Select("parent='" + childRow["code"].ToString() + "'");                int count = leafRows.Count();                if (leafRows.Count() > 0)
                    {
                        sb.Append("<li><span>" + childRow["name"].ToString() + "</span>");
                        sb.Append("<ul>");
                        foreach (DataRow leafRow in leafRows)
                        {
                            sb.Append("<li>");
                            sb.Append("<a href='"+leafRow["url"].ToString()+"'>" + leafRow["name"].ToString() + "</a>");
                            sb.Append("</li>");
                        }
                        sb.Append("</ul>");
                        sb.Append("</li>");                }
                    else
                    {
                        sb.Append("<li>");
                        sb.Append("<a href='"+childRow["url"].ToString()+"'>" + childRow["name"].ToString() + "</a>");
                        sb.Append("</li>");
                    }
                }
                sb.Append("</ul>");
                sb.Append("</li>");
            }        return sb.ToString();    }
      

  3.   


    我的方法没有用到reeNode 节点!