Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在TreeView控件中获取选定节点的所有父节点(最多根节点)?_C#_Asp.net_Treeview_Hierarchy - Fatal编程技术网

C# 如何在TreeView控件中获取选定节点的所有父节点(最多根节点)?

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

如果我有一个TreeView(myTreeview),我如何获得所选节点的所有父节点(父节点、父节点的父节点等)的列表

如果需要实际对象,请递归使用该属性,直到到达根。比如:

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