递归算法
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);
}
}
}
}