列表上的递归循环以添加到树视图

时间:2015-03-22 15:57:09

标签: c# recursion tree treeview

我有一个类的列表,该类还有一个类,用于在树视图中显示地图。

public class Option
{
    public Guid Id;

    public string Title;
    public string Description;
    public List<GotoOption> GotoOptions;
    public bool IsEnd;
    public string GotoValueParent;

    public Option()
    {
        this.IsEnd = false;
        this.GotoOptions = new List<GotoOption>();
    }

}

public class GotoOption
{
    public Guid GotoId;
    public string Value;
}

所以一个Option可以有很多GotoOptions,这些由Guid映射,所以如果我的树视图看起来像:

  1. 1.1。分支

    1.2。分支

    1.3。分支

    将有4个选项,但树视图将有3个GotoOptions链接到分支。

    所以我的目标是基本上创建一个递归循环,所以我不必手动创建一个循环,但我不知道如何启动它。

    目前我有 -

    private void PopulateTreeView(Option option)
    {
        if (option != null)
        {
            TreeNode node = new TreeNode();
            node.Text = option.Title;
            node.Tag = option;
            pages.Nodes.Add(node);
    
            foreach (GotoOption op in option.GotoOptions)
            {
                Option ops = Options.FirstOrDefault(i => i.Id == op.GotoId);
                TreeNode inner = new TreeNode();
                inner.Text = ops.Title;
                inner.Tag = ops;
    
                node.Nodes.Add(inner);
    
                foreach (GotoOption op2 in ops.GotoOptions)
                {
                    Option opps = Options.FirstOrDefault(i => i.Id == op2.GotoId);
                    TreeNode inner2 = new TreeNode();
                    inner2.Text = opps.Title;
                    inner2.Tag = opps;
    
                    inner.Nodes.Add(inner2);
                }
            }
        }
    }
    

    仅循环3层,但我们可以有10-25个奇数层,这是很多手动代码。我一直在研究它如何与文件和文件夹http://www.dotnetperls.com/recursive-file-list一起使用,但我似乎无法将其从它的工作方式转换为使用我的代码。任何帮助都会很棒。

2 个答案:

答案 0 :(得分:0)

管理解决,我在创建的节点中创建了一个可选参数,如果未传入参数,则会创建一个新参数。

private void PopulateTreeView(Option option, TreeNode existingNode = null)
{
    if (option != null)
    {
        TreeNode newNode = new TreeNode();
        newNode.Text = option.Title;
        newNode.Tag = option;

        if (existingNode == null)
        {
            pages.Nodes.Add(newNode);
        }
        else
        {
            existingNode.Nodes.Add(newNode);
        }

        foreach (GotoOption gotoOption in option.GotoOptions)
        {
            Option newOption = Options.FirstOrDefault(i => i.Id == gotoOption.GotoId);
            PopulateTreeView(newOption, newNode);
        }
    }
}

答案 1 :(得分:0)

private void CreateTreeView()
{
    var roots = Options.Select(z => z.Id)

        .Except(Options.SelectMany(z => z.GotoOptions.Select(x => x.GotoId)))

        .Select(z => Options.Single(x => x.Id == z));

    var treeNodes = roots.Select(GetNode);

    foreach (var treeNode in treeNodes)
    {
        pages.Nodes.Add(treeNode);
    }
}

private TreeNode GetNode(Option option)
{
    var node = new TreeNode
    {
        Text = option.Title,
        Tag = option
    };

    foreach (var child in option.GotoOptions.Select(z => Options.Single(x => x.Id == z.GotoId)))
    {
        node.Nodes.Add(GetNode(child));
    }

    return node;
}