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