权限系统收获——C#递归方法实现zTree

       为了满足在一个树形菜单上添加多级子菜单,我们想到用递归来实现,这样做,灵活度立马提升!不管用户想添加多少级菜单我们都能满足他!但是如果考虑到性能的话,递归可能会影响到性能,所以说用的时候还是需要多方面考虑的。

        先根据数据库表介绍一下我们的实现逻辑,以下是使用到的数据库表

        TR_Resource

ID ResourceName ParentID
1 廊坊师范学院 0
2 数信学院 1
3 物电学院 1
4 信息与计算科学专业 2

ID:ParentID 对应的子节点id

ResourceName:名称

ParentID:父节点id,即当ParentID的值与ID的值相等时,他们才为父子的关系,如廊坊师范学院的ID为“1”,而数信学院和物电学院的ParentID的值也为“1”,那么证明数信学院和物电学院都为廊坊师范学院的孩子节点,又如:数信学院的ID为“2”,而信息与计算科学的ParentID也为“2”,证明信息与计算科学是数信学院的孩子节点。

        这次学习zTree还学习到了一点,就是在js方法中直接调用后台的方法,不过后台方法前边需要添加[WebMethod],方法还得是static的,这一点我也不是很清楚,如果我哪里说得不对的地方麻烦大侠帮忙指出来,下面就来介绍一下我的实现过程。

js


    
    
    
    
    


    


后台

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Web.Services;
using System.Data.SqlClient;
using System.Configuration;
using System.Text;

namespace WebForzTree
{
    public partial class Index : System.Web.UI.Page
    {
        private static string connectionString = ConfigurationManager.ConnectionStrings["DBConnString"].ToString();
        public string NodeData;
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            { }
        }

        //XML里面的一个方法,在jquery用ajax方法调用;
        /// 
       /// 获取所有的一级节点
        /// 
        /// 所有的节点信息
        [WebMethod]
        public static List FindAll()
        {
           //实例化类
            Index index = new Index();
            SqlConnection connection = new SqlConnection(connectionString);
            string sqlText = "select * from TR_Resource where ParentID=0";
            //定义实体类列表
            List list = new List();
            //将所有的一级节点放到list中
            list =index.GetParentID(sqlText);
            index.GetChilds(ref list);
            return list;
        }
        /// 
        ///获所有的一级节点
        /// 
        /// 
        /// 
        private List GetParentID(string sql)
        {
            List user = new List();
            SqlDataReader reader = null;
            reader = ExecuteReader(sql);
            while (reader.Read())
            {
                user.Add(ObjToListC(reader));
            }
            return user;
        }

        /// 
        /// 将获取的所有的子节点放到children中
        /// 
        /// 按引用传值,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中
        public void GetChilds(ref List list)
        {
            foreach (dCategory model in list)
            {
                //通过上级ID获取子级,然后添加到lstModel中
                List lstModel = GetChildsID(model.cId);
                if (lstModel.Count > 0)
                {
                    model.children = lstModel;
                    //采用递归的形式
                    GetChilds(ref lstModel);
                }
            }
        }

        /// 
        /// 根据父节点的id获取子节点
        /// 
        /// 父节点id
        /// 所有的子节点id
        public List GetChildsID(string dParentId)
        {
            //定义一个列
            List result = new List();
            SqlDataReader sqlReader = null;
            string strSql = String.Format(@"select * from TR_Resource where ParentID={0}", dParentId);
            sqlReader = ExecuteReader(strSql);
            while (sqlReader.Read())
            {
                result.Add(ObjToListC(sqlReader));
            }
            sqlReader.Close();
            return result;
        }
       
      
        /// 
        /// 解析查询结果
        /// 
        /// 
        /// 父节点id,子节点id,子节点名字
        private dCategory ObjToListC(SqlDataReader reader)
        {
            dCategory model = new dCategory();
            if (reader != null)
            {
                //子节点id
                if (reader["ID"] != null && reader["ID"].ToString() != "")
                {
                    model.cId = reader["ID"].ToString();
                }
                //节点名字
                if (reader["ResourceName"] != null && reader["ResourceName"].ToString() != "")
                {
                    model.cName = reader["ResourceName"].ToString();
                }
                //父节点id
                if (reader["ParentID"] != null && reader["ParentID"].ToString() != "")
                {
                    model.cParentId = reader["ParentID"].ToString();
                }
                //地址
                if (reader["URL"] != null && reader["URL"].ToString() != "") {
                    model.cUrl = reader["URL"].ToString();
                }
            }
            return model;
        }


        private SqlDataReader ExecuteReader(string strSQL)
        {
            SqlConnection connection = new SqlConnection(connectionString);
            SqlCommand cmd = new SqlCommand(strSQL, connection);
            try
            {
                connection.Open();
                SqlDataReader myReader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                return myReader;
            }
            catch (System.Data.SqlClient.SqlException e)
            {
                throw e;
            }
        }
    }

}


以上就是我的实现过程,刚开始研究这个树的时候绕的我跟着团团转,现在终于实现了,还是很高兴的,而且在这个小Demo中无意间还学会了在js方法中调用后台的方法,之前只有asp的控件方法会在后台写,js调用一般处理程序中的方法,呵呵,这么容易高兴呢!

整个实现过程我已经上传到了,需要的话可以去下载,点击打开链接。

你可能感兴趣的:(C#)