C# 如何在TreeView控件中获取选定节点的所有父节点(最多根节点)?
如果我有一个TreeView(myTreeview),我如何获得所选节点的所有父节点(父节点、父节点的父节点等)的列表 如果需要实际对象,请递归使用该属性,直到到达根。比如:C# 如何在TreeView控件中获取选定节点的所有父节点(最多根节点)?,c#,asp.net,treeview,hierarchy,C#,Asp.net,Treeview,Hierarchy,如果我有一个TreeView(myTreeview),我如何获得所选节点的所有父节点(父节点、父节点的父节点等)的列表 如果需要实际对象,请递归使用该属性,直到到达根。比如: private void GetPathToRoot(TreeNode node, List<TreeNode> path) { if(node == null) return; // previous node was the root. else { path.add
private void GetPathToRoot(TreeNode node, List<TreeNode> path)
{
if(node == null) return; // previous node was the root.
else
{
path.add(node);
GetPathToRoot(node.Parent, path);
}
}
private void GetPathToRoot(树节点,列表路径)
{
if(node==null)return;//上一个节点是根节点。
其他的
{
添加(节点);
GetPathToRoot(node.Parent,path);
}
}
我建议您创建一组自己的树帮助程序,例如,下一个用于解决您的问题:
public static class TreeHelpers
{
public static IEnumerable<TItem> GetAncestors<TItem>(TItem item, Func<TItem, TItem> getParentFunc)
{
if (getParentFunc == null)
{
throw new ArgumentNullException("getParentFunc");
}
if (ReferenceEquals(item, null)) yield break;
for (TItem curItem = getParentFunc(item); !ReferenceEquals(curItem, null); curItem = getParentFunc(curItem))
{
yield return curItem;
}
}
//TODO: Add other methods, for example for 'prefix' children recurence enumeration
}
公共静态类树帮助器
{
公共静态IEnumerable GetFounders(TItem项,Func getParentFunc)
{
如果(getParentFunc==null)
{
抛出新ArgumentNullException(“getParentFunc”);
}
if(ReferenceEquals(item,null))产生中断;
for(TItem curItem=getParentFunc(item);!ReferenceEquals(curItem,null);curItem=getParentFunc(curItem))
{
收益率曲线;
}
}
//TODO:添加其他方法,例如“prefix”子循环枚举
}
和使用示例(在您的上下文中):
IList-antestorlist=TreeHelpers.get祖先(node,x=>x.Parent.ToList();
为什么这比使用list.Add()更好因为我们可以使用惰性LINQ函数,比如.FirstOrDefault(x=>…)
另外,要将“当前”项包含到结果可枚举中,请使用
TItem curItem=item
,而不是TItem curItem=getParentFunc(item)
我认为您需要使用一个节点数组
List<TreeNode> resultNodes = new List<TreeNode>()
private void GetNodesToRoot(TreeNode node)
{
if(node == null) return; // previous node was the root.
else
{
resultNodes.add(node);
GetNodesToRoot(node.Parent);
}
}
List resultNodes=new List()
私有void getNodesRoot(TreeNode节点)
{
if(node==null)return;//上一个节点是根节点。
其他的
{
添加(节点);
GetNodesToRoot(node.Parent);
}
}
Alexander Mavrinsky的答案非常有用,但我的方法有很多变化。我的代码不仅在方法上,而且在调用站点(通过指定他的泛型)上都更短、更清晰。
公共静态类树扩展
{
公共静态IEnumerable GetFounders(此TreeNode节点)
{
if(node==null)
屈服断裂;
while((node=node.Parent)!=null)
收益回报节点;
}
}
例如:var firstCheckedAncestor=treeNode.get祖先().First(x=>x.Checked)代码>
或者如果您确实需要每个父节点:var allAncestors=treeNode.get祖先().ToList()代码>
但是,如果您计划有多个使用相同逻辑的类,下面是通用方法和每个类的两个扩展(因此您可以在每个调用方上保留更简单的API):
public静态IEnumerable getOrients(T项,Func getParent)
{
如果(项==null)
屈服断裂;
while((item=getParent(item))!=null)
收益回报项目;
}
公共静态IEnumerable GetFounders(此树节点)=>GetFounders(节点,x=>x.Parent);
公共静态IEnumerable GetFounders(此控件)=>GetFounders(控件,x=>x.Parent);
嘿,无意冒犯……我只是说你不需要第二个参数谢谢!这是非常有用的。递归方法非常递归;)
List<TreeNode> resultNodes = new List<TreeNode>()
private void GetNodesToRoot(TreeNode node)
{
if(node == null) return; // previous node was the root.
else
{
resultNodes.add(node);
GetNodesToRoot(node.Parent);
}
}