zoukankan      html  css  js  c++  java
  • 递归算法

    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);
                }
            }
        }
    } 

  • 相关阅读:
    判断客户端类型
    关于element-ui select组件change事件只要数据变化就会触发的解决办法
    log4net的基本配置及用法
    WCF自定义扩展,以实现aop!
    继承IDbConnection连接不同数据库
    MVC中你必须知道的13个扩展点
    Sql导出数据报错-->SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEMENT'OpenRowset/OpenDatasource' 的访问
    "当前方法的代码已经过优化,无法计算表达式的值"的这个错误的解决方案!!!
    WCF中安全的那些事!!!
    Linq to sql 的语法
  • 原文地址:https://www.cnblogs.com/poissonnotes/p/1664835.html
Copyright © 2011-2022 走看看