递归算法

namespace TreeViewNode
{
    /// <summary>
    /// author:poisson
    /// </summary>
    public partial class _Default : System.Web.UI.Page
    {
        DataTable dt = null; 
 
        //static string _id;
        
        protected void Page_Load(object sender, EventArgs e)
        {
            //if (Request.Params["id"] != null) _id = Request.Params["id"];
            TreeBind(TreeView1);
        } 
 
        /// <summary>
        /// 初始化树控件
        /// </summary>
        /// <param name="_tv">树控件</param>
        public void TreeBind(TreeView _tv)
        {
            _tv.Nodes.Clear();
            dt = DbHelperSQL.Query("select * from Menu").Tables[0];
            TreeBindNode(null, _tv);
        } 
 
        /// <summary>
        /// 递归绑定树
        /// </summary>
        /// <param name="_node">节点</param>
        /// <param name="_tv">树控件</param>
        private void TreeBindNode(TreeNode _node, TreeView _tv)
        {
            DataRow[] dr; 
 
            if (_node == null)//添加根结点
                dr = dt.Select("ParentId is null");//获取根结点
            else//添加子结点
                dr = dt.Select("ParentId='" + _node.Value + "'");
            foreach (DataRow d in dr)
            {
                TreeNode td = new TreeNode();
                
                //展开节点
                td.Expanded = true; 
 
                if (dt.Select("ParentId = " + d["id"]).Length > 0)//如果有子结点的话,意思就是说子结点数目大于0
                {
                    td.NavigateUrl = "javascript:selectData("+d["id"]+",'"+d["name"]+"');";
                    //td.NavigateUrl = "?id=" + d["id"];
                    td.Text = "<input type='checkbox' id='chk_" + d["id"] + "' style='border:0px' name='cbRight' value='' onclick=selectChk(" + d["id"] + ")><font color=red><font style='color:black;cursor:hand'>" + d["Name"].ToString() + "</font>";
                }
                else
                {
                    td.NavigateUrl = "javascript:selectData(" + d["id"] + ",'" + d["name"] + "')";
                    ////变色
                    //if (_id == d["id"].ToString())
                    //    td.Text = "<input type='checkbox' id='chk_" + d["id"] + "' style='border:0px' name='cbRight' value='' onclick=selectChk(" + d["id"] + ")><font color=red>" + d["name"].ToString() + "</font>";
                    //else
                        td.Text = "<input type='checkbox' id='chk_" + d["id"] + "' style='border:0px' name='cbRight' value='' onclick=selectChk(" + d["id"] + ")>" + d["name"].ToString();
                }
                td.Value = d["id"].ToString();//将本节点value赋值以便获取下级结点
                if (_node == null)
                    _tv.Nodes.Add(td);
                else
                    _node.ChildNodes.Add(td); 
 
                TreeBindNode(td, _tv);
            }
        } 
 
        protected void Button1_Click(object sender, EventArgs e)
        {
            string Id;
            string ParentId; 
 
            Id       = this.hdnId.Value;
            ParentId = this.hdnParentId.Value; 
 
 
            //检查父结点是否为本结点,或者是否父结点与子结点其中有一个未选择
            //是的话就撤消修改
            if (Id == ParentId||Id==""||ParentId == "")
            {
                ClearAll();
                return;
            } 
 
            //递归检查要修改的父结点是否在此节点的下面,
            //如果是的话就撤消修改
            bool flag = true; 
 
            checkTheTree(Id, ParentId, ref flag); 
 
            if (flag)
            {
                Response.Write("<script>alert('更新成功')</script>");
                ClearAll();
            }
            else ClearAll();
            //if (Id == "" || ParentId == "") return;
        } 
 
        /// <summary>
        /// 清空对话框
        /// </summary>
        protected void ClearAll()
        {
            this.hdnId.Value = "";
            this.hdnParentId.Value = "";
            this.TextBox1.Text = "";
        } 
 
        /// <summary>
        /// 递归检查要修改的父结点是否在此节点的下面
        /// 如果是的话就撤消修改
        /// </summary>
        /// <param name="id">递归下来的子结点</param>
        /// <param name="ParentId">要检查的父结点</param>
        protected void checkTheTree(string Id, string CheckId,ref bool flag)
        {
            DataRow[] dr; 
 
            dr = dt.Select("ParentId = " + Id); 
 
            foreach (DataRow d in dr)
            {
                //如果发现要修改的结点为要增加至的结点的子结点时就跳出
                if (CheckId == (d["id"].ToString()))
                {
                    flag = false;
                    return;
                }
                else checkTheTree(d["ParentId"].ToString(),CheckId,ref flag);
            }
        }
    }
} 

posted @ 2010-02-06 10:53  poisson_notes  阅读(248)  评论(0编辑  收藏  举报