无法解决无限递归问题

时间:2014-02-25 09:16:21

标签: c# recursion treeview

我最近开始编写从列表中填充树视图控件的编码,这是我开始的地方。

http://msmvps.com/blogs/deborahk/archive/2009/11/09/populating-a-treeview-control-from-a-list.aspx

我目前正在尝试检索注册表路径并将它们存储到列表中。从该列表中,我尝试将其添加为树视图控件的父节点。然后我遍历注册表中的每个级别,并将它们添加为节点,最终创建一个树状副本。我正在通过一个单独的进程检索注册表信息,我回避在c#中使用Registry API。我将上面链接中的所有代码合并到我当前的代码中,现在我每次编译时都会遇到无限递归错误。

这是我正在处理的当前代码。

private void registry()
{
    string hivelist_output = process.StandardOutput.ReadToEnd();
    string[] hivelist_lines = Regex.Split(hivelist_output, "\r\n");
    string[] registry_paths = new string[hivelist_lines.Length];
    List<string> registry_path_list = new List<string>();

    for (i = 0; i < hivelist_lines.Length; i++)
    {
        registry_paths[i] = hivelist_lines[i].Substring(22);
        registry_path_list.Add(registry_paths[i].Trim());
    }
    for (i = 0; i < registry_path_list.Count; i++)
    {
        treeViewList.Add(new TreeViewItem()
        {
            ParentID = 0,
            ID = i,
            Text = registry_path_list[i]
        });
    }
    PopulateTreeView(0, null);
    treeView1.ExpandAll();
}
private void PopulateTreeView(int parentId, TreeNode parentNode)
{
    var filteredItems = treeViewList.Where(item => item.ParentID == parentId);

    TreeNode childNode = new TreeNode();

    foreach (var i in filteredItems.ToList())
    {
        if (parentNode == null)
            childNode = treeView1.Nodes.Add(i.Text);
        else
            childNode = parentNode.Nodes.Add(i.Text);

        PopulateTreeView(i.ID, childNode);
    }
}

无限递归的错误指向我这行代码,我不明白为什么。

childNode = parentNode.Nodes.Add(i.Text);

我很感谢你就这件事提出了很好的建议。提前谢谢!

-------------------------------------解决--------- ----------------------------------

继续前进,现在我的下一个问题是在每个父节点(注册表路径)下面添加子项,以及每个先前检索的子项和键值以及数据类型下面的子项。由于注册表很深,我怎么能这样做,以便我绘制所有可能的值而不使用太多的嵌套循环?谢谢!

*我希望实现的结构

registry path
    - subkey1
        - subkeys of subkey1
            - subkeys of subkey1.1
            - data types & values
    -subkey 2
        .
        .
        .
    -subkey 3
    .
    .
    .
    -subkey n
    - data types & values

某某

1 个答案:

答案 0 :(得分:1)

您正在添加ID为0的TreeViewItems 。因此,您的PopulateTreeView始终以ID 0递归调用自身。

您需要修复设置方法:

for (i = 0; i < registry_path_list.Count; i++)
{
    treeViewList.Add(new TreeViewItem()
    {
        ParentID = 0,
        ID = 0,
        Text = registry_path_list[i]
    });
}

并使用相应的ID。