
根据list生成TreeView
现在好多都是根据一个根节点ID去绑定的,我不需要这种,需要一个根据任意list生成TreeView的程序,用递归或者别的方法都行...
现在好多都是根据一个根节点ID去绑定的,我不需要这种,需要一个根据任意list生成TreeView的程序,用递归或者别的方法都行
展开
展开全部
如果要实现不同层级的树,你的list里面的每个对象必须标明他们之间的父子关系。现在假定实现一个菜单集合绑定到TreeView,用的是递归的方法:
private void LoadTree(TreeNodeCollection nodes, int parentId)
{
var listAdminMenu = CurrentStationMenus.Where(t => t.ParentID == parentId);
if (listAdminMenu.Count() == 0) return;
foreach (var menu in listAdminMenu)
{
var tNode = new TreeNode(menu.Text, menu.ID.ToString());
nodes.Add(tNode);
LoadTree(tNode.ChildNodes, menu.ID);
}
}
其中CurrentStationMenus假定是缓存到内存里的菜单集合(即你所说的list)
下面这句调用即实现绑定:
TreeViewMenu.Nodes.Clear();
LoadTree(TreeViewMenu.Nodes, 0);
如果要实现你说的任意一个list传进来都绑定,那么你就需要自己定义一个通用的类型用来放到list里了。把你需要绑定到该树的对象转换成你这个通用的类型,比如定义一个叫TreeNodeData的类型,给它几个必要的属性:
public class TreeNodeData
{
public int ID{get;set;}
public int ParentID{get;set;}
public string Value{get;set;}
public string Text{get;set;}
}
private void LoadTree(TreeNodeCollection nodes, int parentId)
{
var listAdminMenu = CurrentStationMenus.Where(t => t.ParentID == parentId);
if (listAdminMenu.Count() == 0) return;
foreach (var menu in listAdminMenu)
{
var tNode = new TreeNode(menu.Text, menu.ID.ToString());
nodes.Add(tNode);
LoadTree(tNode.ChildNodes, menu.ID);
}
}
其中CurrentStationMenus假定是缓存到内存里的菜单集合(即你所说的list)
下面这句调用即实现绑定:
TreeViewMenu.Nodes.Clear();
LoadTree(TreeViewMenu.Nodes, 0);
如果要实现你说的任意一个list传进来都绑定,那么你就需要自己定义一个通用的类型用来放到list里了。把你需要绑定到该树的对象转换成你这个通用的类型,比如定义一个叫TreeNodeData的类型,给它几个必要的属性:
public class TreeNodeData
{
public int ID{get;set;}
public int ParentID{get;set;}
public string Value{get;set;}
public string Text{get;set;}
}
更多追问追答
追问
我现在的情况是有的树节点的父节点不存在,你这种方法会把这些没爸的孩子的都过滤掉
追答
这要看你想怎么样了,如果你想没爹啊孩子都放到根下面,就把没爹的孩子的ParentID都设为0嘛。总之一个原则,你要把所有的东西放到树上去,总得告诉这棵树,哪个是父,哪个是子。这是由树的基本特性确定的。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询