根据parent,depth递归实现treeview public class Department { public string name { get; set; } public string code {get;set;} private List<Department> _childdepartment = new List<Department>(); public List<Department> childDepartment { get { return _childdepartment ; } } } public class User { public string usrname { get; set; } } public static Department GetList() { var a = new Department { name = "a", code = "0" }; var b = new Department { name = "b", code = "001" }; var c = new Department { name = "c", code = "002" }; a.ChildDepartment.Add(b); a.ChildDepartment.Add(c); return a; }页面treeview private void BindData(TreeNodeCollection treeNodeCollection, Department dept) { var node = new TreeNode { Text =dept.name, Value = dept.code }; treeNodeCollection.Add(node); if (dept.ChildDepartment.Count > 0) dept.ChildDepartment.ForEach(p => { BindData(node.ChildNodes, p); }); }
非递归的。递归简单,自己研究去。著名的斐波那契该知道吧。你用递归斐波那契到50层看看效率。
public class Department
{
public string name { get; set; }
public string code {get;set;}
private List<Department> _childdepartment = new List<Department>();
public List<Department> childDepartment
{
get
{
return _childdepartment ;
}
}
}
public class User
{
public string usrname { get; set; }
}
public static Department GetList()
{
var a = new Department { name = "a", code = "0" };
var b = new Department { name = "b", code = "001" };
var c = new Department { name = "c", code = "002" };
a.ChildDepartment.Add(b);
a.ChildDepartment.Add(c);
return a;
}页面treeview
private void BindData(TreeNodeCollection treeNodeCollection, Department dept)
{
var node = new TreeNode { Text =dept.name, Value = dept.code };
treeNodeCollection.Add(node);
if (dept.ChildDepartment.Count > 0)
dept.ChildDepartment.ForEach(p => { BindData(node.ChildNodes, p); });
}
看来这里对所谓"著名的斐波那契"有个知其然不知其所以然的误区.比如我们要计算 f(n)=f(n-1)+f(n-2), 最初最笨的做法是简单地按照这个公式去计算, 因为在计算f(n-1)的时候其内部又重复计算了一遍f(n-2), 当递归时这种重复是巨大的. 所以, 只要先计算f(n-2)然后才计算f(n-1), 并且每一次计算完f(n)都缓存起来, 每一次计算f(n)之前都先去查询缓存中有没有, 那么就没有你说的那种东西. 因此我说你是知其然不知其所以然. 你觉得这个简单的重构也能随便归咎于递归-非递归之极端争论?
我也想过用递归,我试过,但没能成功。。实现起来好难哦,
等高手解决。。
{
TreeNode rootnode = new TreeNode();
rootnode.Text = "管理";
treeView1.Nodes.Add(rootnode);
DiGuiFillTreeView(0, rootnode);
}
private void DiGuiFillTreeView(int ParentCode,TreeNode pNode)//ParentCode为此菜单的上级编码
{
DataSet ds = GetData(ParentCode);
if (ds.Tables[0].Rows.Count > 0)
{
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
TreeNode node = new TreeNode();
node.Text = ds.Tables[0].Rows[i]["cdmc"].ToString();
pNode.Nodes.Add(node);
DiGuiFillTreeView(Convert.ToInt32(ds.Tables[0].Rows[i]["xh"]), node);
}
}
}
{
if (!IsPostBack)
{
CreateObject();
}
} private void CreateObject()
{
StringBuilder sb = new StringBuilder();
//获取所有菜单集合
List<SysFun> sysFuns = SysFunManager.GetAll();
//生产菜单列表
sb.Append(StrMenu(sysFuns, 0,""));
//将生成的菜单列表添加到页面中
divMenu.InnerHtml = sb.ToString(); }
/// <summary>
/// 生成菜单列表
/// </summary>
/// <param name="myMenu">菜单集合</param>
/// <param name="parentId">父ID</param>
/// <param name="peixStr">复选框Id</param>
/// <returns>返回菜单列表</returns>
public string StrMenu(List<SysFun> myMenu , int parentId,string peixStr)
{
StringBuilder sb = new StringBuilder();
foreach (SysFun sysFuns in myMenu)
{
if (sysFuns.ParentNodeId == parentId)
{
if (parentId == 0)
{
peixStr = "";
sb.Append ( "<div class='parentMenu'>");
}
else
{
sb.Append ("<div class='chaildMenu'>");
} //拼接复选框Id
string cbName = peixStr + "_" + sysFuns.Id;
//添加复选框
string str = "<input type='checkbox' name='cbRole' id='{2}' value='{0}' onclick=selRole(\"{2}\") />{1}";
sb.AppendFormat(str, sysFuns.Id, sysFuns.DisplayName,cbName); //格式化str
string childNode = StrMenu(myMenu, sysFuns.Id,cbName); //调用自己,实现迭代
sb.Append(childNode); //追加字符串
sb.Append("</div>");
}
}
return sb.ToString();
}